【百度云搜索,搜各種資料:http://bdy.lqkweb.com】
【搜網(wǎng)盤,搜各種資料:http://www.swpan.cn】
本文翻譯自The Flask Mega-Tutorial Part I: Hello, World!
一趟愉快的學習之旅即將開始,跟隨它你將學會用Python和Flask來創(chuàng)建Web應用。上面的視頻包含了整個教程的內(nèi)容預覽(譯者注:視頻見原文)。通過學習本章內(nèi)容,你將學會如何創(chuàng)建一個Flask項目和二,并在自己的電腦上運行一個簡單的Flask Web應用。
教程中所有的代碼示例都托管在GitHub上耳胎。雖然直接從GitHub下載代碼可以節(jié)省寫代碼的步驟惯吕,但是我強烈建議你至少在前幾章自己動手書寫這些代碼。一旦你熟悉了Flask和示例應用怕午,一些繁瑣重復的代碼就可以直接從GitHub復制了废登。
在每章的開頭,我都將提供三個GitHub的鏈接來幫助你順暢地學習本章的內(nèi)容郁惜。點擊Browse鏈接會打開GitHub上Microblog項目在本章的對應代碼庫頁面堡距,不會包含之后章節(jié)的任何新增代碼。而Zip鏈接則提供了這份代碼庫的zip打包文件的下載地址兆蕉。如果點擊Diff鏈接羽戒,打開的將會是本章節(jié)的代碼變更信息。
本章的GitHub鏈接為: Browse, Zip, Diff.
安裝Python
你說你還沒有安裝Python虎韵?那還等什么易稠!立馬安裝吧。如果操作系統(tǒng)默認沒有提供Python安裝包包蓝,可以從Python官方網(wǎng)站下載驶社。如果你使用Microsoft Windows操作系統(tǒng)并且打算使用WSL或者Cygwin呆奕,需要注意,不要在上面使用Windows版本的Python衬吆,而要使用類Unix版本,比如從Ubuntu獲壬(對應WSL)或從Cygwin上獲取逊抡。
為了驗證Python是否正確安裝,你可以打開一個終端窗口并輸入python3
(如果不存在這個命令零酪,那就輸入python
)冒嫡。預期的輸出如下:
$ python3
Python 3.5.2 (default, Nov 17 2016, 17:05:23)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> _
Python解釋器中,光標不斷閃爍四苇,等待著你輸入Python語句孝凌。在未來的章節(jié)中,你可以充分體會到交互式解釋器的魅力月腋。至少現(xiàn)在它能夠幫你確認Python已經(jīng)成功安裝的事實蟀架。可以輸入exit()
并回車來退出交互式解釋器榆骚。在Linux和Mac OS X操作系統(tǒng)上片拍,按下快捷鍵Ctrl-D也可以快速退出交互式解釋器。在Windows操作系統(tǒng)上妓肢,則是通過按下Ctrl-Z后跟上Enter快捷鍵來快速退出捌省。
安裝Flask
下一步開始安裝Flask,在這之前我要告訴你安裝Python三方包的最佳實踐碉钠。
Python將所有三方包托管到一個公共倉庫纲缓,任何人都能從這個公共倉庫下載并安裝所有的三方包。Python將三方包公共倉庫命名為PyPI以表示Python Package Index的縮寫(被一些人戲稱為”cheese shop”)喊废。從PyPI上安裝三方包非常簡單祝高,Python專門提供了一個名為pip
的工具來解決這個問題(Python2.7中不含pip
工具,需要單獨安裝)污筷。
安裝三方包時褂策,使用pip
命令如下:
$ pip install <package-name>
有趣的是,這個方法在大多數(shù)情況下不適用颓屑。假如Python解釋器是全局安裝的斤寂,所有用戶都能使用,那么普通用戶則沒有權(quán)限來修改它揪惦,因此只能用管理員賬戶來執(zhí)行安裝操作遍搞。即使忽略操作的復雜性,使用這種全局安裝的方式會發(fā)生什么器腋?pip
工具從PyPI上下載三方包并安裝到全局Python目錄下溪猿,即刻起钩杰,所有Python腳本都可以訪問到這個三方包。想象這樣一個場景诊县,你之前用當時的最新版本Flask——0.11版本的Flask開發(fā)了一個Web應用讲弄,現(xiàn)在Flask已經(jīng)更新到了0.12版本,你想要使用0.12版本的Flask開發(fā)第二個Web應用依痊。但是避除,如果將Flask從0.11版本升級到0.12版本可能會導致第一個Web應用出現(xiàn)故障。解決這個問題的方法最好不過為舊Web應用安裝和使用Flask0.11版本胸嘁,為新Web應用安裝和使用Flask0.12版本瓶摆。
為了解決維護不同應用程序?qū)煌姹镜膯栴},Python使用了虛擬環(huán)境的概念性宏。 虛擬環(huán)境是Python解釋器的完整副本群井。在虛擬環(huán)境中安裝三方包時只會作用到虛擬環(huán)境,全局Python解釋器不受影響毫胜。 那么书斜,就為每個應用程序安裝各自的虛擬環(huán)境吧。 虛擬環(huán)境還有一個好處酵使,即它們由創(chuàng)建它們的用戶所擁有菩佑,所以不需要管理員帳戶。
我們先創(chuàng)建項目目錄凝化,我將這個應用命名為microblog:
$ mkdir microblog
$ cd microblog
如果你正在使用Python3稍坯,虛擬環(huán)境已經(jīng)成為內(nèi)置模塊,可以直接通過如下命令來創(chuàng)建它:
$ python3 -m venv venv
譯者注:這個命令不一定能夠執(zhí)行成功搓劫,比如譯者在Ubuntu16.04環(huán)境下執(zhí)行瞧哟,提示需要先安裝對應的依賴。
sudo apt-get install python3-venv
使用這個命令來讓Python運行venv
包枪向,它會創(chuàng)建一個名為venv
的虛擬環(huán)境勤揩。 命令中的第一個“venv”是Python虛擬環(huán)境包的名稱,第二個是要用于這個特定環(huán)境的虛擬環(huán)境名稱秘蛔。 如果你覺得這樣很混亂陨亡,可以用你自定義的虛擬環(huán)境名字替換第二個venv
。我習慣在項目目錄中創(chuàng)建了名為venv
的虛擬環(huán)境深员,所以無論何時cd
到一個項目中负蠕,都會找到相應的虛擬環(huán)境。
請注意倦畅,在一些操作系統(tǒng)中遮糖,你可能需要在上面的命令中使用python
而不是python3
。 一些安裝規(guī)范對Python 2.x版本使用python
叠赐,對3.x版本使用python3
欲账,而另一些則將python
映射到3.x版本屡江。
命令執(zhí)行完成后,當前目錄下就會新增一個名為venv
的目錄來存儲這個虛擬環(huán)境的相關(guān)文件赛不。
如果你使用的Python版本低于3.4(包括2.7版本)惩嘉,則不會默認支持虛擬環(huán)境。 對于這些版本的Python踢故,在創(chuàng)建虛擬環(huán)境之前文黎,需要下載并安裝稱為virtualenv的第三方工具。 一旦安裝了virtualenv畴椰,你可以使用以下命令創(chuàng)建一個虛擬環(huán)境:
$ virtualenv venv
不管你用什么方法創(chuàng)建虛擬環(huán)境,創(chuàng)建完畢之后還需要激活才能夠進入這個虛擬環(huán)境鸽粉。 要激活你的全新虛擬環(huán)境斜脂,需使用以下命令:
$ source venv/bin/activate
(venv) $ _
如果你使用的是Microsoft Windows命令提示符窗口,則激活命令稍有不同:
$ venv\Scripts\activate
(venv) $ _
激活一個虛擬環(huán)境触机,終端會話的環(huán)境配置就會被修改帚戳,之后你鍵入python
的時候,實際上是調(diào)用的虛擬環(huán)境中的Python解釋器儡首。 此外片任,終端提示符也被修改成包含被激活的虛擬環(huán)境的名稱的格式。這種激活是臨時的和私有的蔬胯,因此在關(guān)閉終端窗口時它們將不會保留对供,也不會影響其他的會話。 那么氛濒,當你需要同時打開多個終端窗口來調(diào)試不同的應用時产场,每個終端窗口都可以激活不同的虛擬環(huán)境而不會相互影響。
成功創(chuàng)建和激活了虛擬環(huán)境之后舞竿,你可以安裝Flask了京景,命令如下:
(venv) $ pip install flask
想要驗證安裝是否成功,可以打開Python解釋器骗奖,并用import語句來導入它:
>>> import flask
>>> _
如果語句沒有報錯确徙,那么恭喜你,F(xiàn)lask安裝成功了执桌!
“Hello, World” Flask應用
Flask網(wǎng)站展示了一個僅有五行代碼的簡單示例應用程序鄙皇。 而我會告訴你一個稍微更復雜的例子,它將為你編寫更大的應用程序提供一個很好的基礎結(jié)構(gòu)仰挣。
應用程序是存在于包中的育苟。 在Python中,包含__init__.py
文件的子目錄被視為一個可導入的包椎木。 當你導入一個包時违柏,__init__.py
會執(zhí)行并定義這個包暴露給外界的屬性博烂。
那就創(chuàng)建一個名為app
的包來存放整個應用吧。記得切換到microblog目錄下漱竖,并執(zhí)行如下命令:
(venv) $ mkdir app
并在其下創(chuàng)建文件__init__.py
禽篱,輸入如下的代碼:
from flask import Flask
app = Flask(__name__)
from app import routes
上面的腳本僅僅是從flask中導入的類Flask
,并以此類創(chuàng)建了一個應用程序?qū)ο蟆?傳遞給Flask
類的__name__
變量是一個Python預定義的變量馍惹,它表示當前調(diào)用它的模塊的名字躺率。當需要加載相關(guān)的資源,如我將在第二章講到的模板文件万矾,F(xiàn)lask就使用這個位置作為起點來計算絕對路徑悼吱。 代碼的最后,應用程序?qū)肷形创嬖诘?code>routes模塊良狈。
這段代碼后添,乍一看可能會讓人迷惑。
其一薪丁,這里有兩個實體名為app
遇西。 app
包由app目錄和__init__.py
腳本來定義構(gòu)成,并在from app import routes
語句中被引用严嗜。 app
變量被定義為__init__.py
腳本中的Flask
類的一個實例粱檀,以至于它成為app
包的屬性。
其二漫玄,routes
模塊是在底部導入的茄蚯,而不是在腳本的頂部。 最下面的導入是解決循環(huán)導入的問題睦优,這是Flask應用程序的常見問題第队。 你將會看到routes
模塊需要導入在這個腳本中定義的app
變量,因此將routes
的導入放在底部可以避免由于這兩個文件之間的相互引用而導致的錯誤刨秆。
那么在routes
模塊中有些什么凳谦? 路由是應用程序?qū)崿F(xiàn)的不同URL。 在Flask中衡未,應用程序路由的處理邏輯被編寫為Python函數(shù)尸执,稱為視圖函數(shù)。 視圖函數(shù)被映射到一個或多個路由URL缓醋,以便Flask知道當客戶端請求給定的URL時執(zhí)行什么邏輯如失。
這是需要寫入到app/routes.py中的第一個視圖函數(shù)的代碼:
from app import app
@app.route('/')
@app.route('/index')
def index():
return "Hello, World!"
這個視圖函數(shù)簡單到只返回一個字符串作為問候用語。 函數(shù)上面的兩個奇怪的@app.route
行是裝飾器送粱,這是Python語言的一個獨特功能褪贵。 裝飾器會修改跟在其后的函數(shù)。 裝飾器的常見模式是使用它們將函數(shù)注冊為某些事件的回調(diào)函數(shù)。 在這種情況下脆丁,@app.route
修飾器在作為參數(shù)給出的URL和函數(shù)之間創(chuàng)建一個關(guān)聯(lián)世舰。 在這個例子中,有兩個裝飾器槽卫,它們將URL /
和/index
索引關(guān)聯(lián)到這個函數(shù)跟压。 這意味著,當Web瀏覽器請求這兩個URL中的任何一個時歼培,F(xiàn)lask將調(diào)用該函數(shù)并將其返回值作為響應傳遞回瀏覽器震蒋。這樣做是為了在運行這個應用程序的時候會稍微有一點點意義。
要完成應用程序躲庄,你需要在定義Flask應用程序?qū)嵗捻攲樱ㄗg者注:也就是microblog目錄下)創(chuàng)建一個命名為microblog.py的Python腳本查剖。 它僅擁有一個導入應用程序?qū)嵗男校?/p>
from app import app
還記得兩個app
實體嗎? 在這里噪窘,你可以在同一句話中看到兩者笋庄。 Flask應用程序?qū)嵗环Q為app
,是app
包的成員效览。from app import app
語句從app
包導入其成員app
變量无切。 如果你覺得這很混亂荡短,你可以重命名包或者變量丐枉。
只要確保所做的操作完全正確,那么你就可以看到如下面的項目結(jié)構(gòu)圖:
microblog/
venv/
app/
__init__.py
routes.py
microblog.py
不管你信不信掘托,這個應用的第一個版本現(xiàn)在完成了瘦锹! 但是在運行之前,需要通過設置FLASK_APP
環(huán)境變量告訴Flask如何導入它:
(venv) $ export FLASK_APP=microblog.py
如果你使用Microsoft Windows操作系統(tǒng)闪盔,在上面的命令中使用set
替換export
弯院。
萬事俱備,只欠東風泪掀!運行如下命令來運行你的第一個Web應用吧:
(venv) $ flask run
* Serving Flask app "microblog"
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
服務啟動后將處于阻塞監(jiān)聽狀態(tài)听绳,將等待客戶端連接。 flask run
的輸出表明服務器正在運行在IP地址127.0.0.1上异赫,這是本機的回環(huán)IP地址椅挣。 這個地址很常見,并有一個更簡單的名字塔拳,你可能已經(jīng)看過:localhost鼠证。 網(wǎng)絡服務器監(jiān)聽在指定端口號等待連接。 部署在生產(chǎn)Web服務器上的應用程序通常會在端口443上進行監(jiān)聽靠抑,如果不執(zhí)行加密量九,則有時會監(jiān)聽80,但啟用這些端口需要root權(quán)限。 由于此應用程序在開發(fā)環(huán)境中運行荠列,因此Flask使用自由端口5000类浪。 現(xiàn)在打開您的網(wǎng)絡瀏覽器并在地址欄中輸入以下URL:
http://localhost:5000/
或者,你也可以使用另一個URL:
http://localhost:5000/index
應用程序路由映射執(zhí)行了嗎弯予? 第一個URL映射到/
戚宦,而第二個映射到/ index
。 這兩個路由都與應用程序中唯一的視圖函數(shù)相關(guān)聯(lián)锈嫩,所以它們產(chǎn)生相同的輸出受楼,即函數(shù)返回的字符串。 如果你輸入任何其他網(wǎng)址呼寸,則會出現(xiàn)錯誤艳汽,因為只有這兩個URL被應用程序識別。
完成演示之后对雪,你可以按下Ctrl-C來停止Web服務河狐。
真是可喜可賀!你已經(jīng)成功地向成為一名Web開發(fā)者的道路上邁出了重要的第一步瑟捣!