Flask 教程 第一章:Hello, World!

百度云搜索,搜各種資料:http://bdy.lqkweb.com

搜網(wǎng)盤,搜各種資料:http://www.swpan.cn

本文翻譯自The Flask Mega-Tutorial Part I: Hello, World!

一趟愉快的學習之旅即將開始,跟隨它你將學會用PythonFlask來創(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被應用程序識別。

Hello, World!

完成演示之后对雪,你可以按下Ctrl-C來停止Web服務河狐。

真是可喜可賀!你已經(jīng)成功地向成為一名Web開發(fā)者的道路上邁出了重要的第一步瑟捣!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末馋艺,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子迈套,更是在濱河造成了極大的恐慌捐祠,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件桑李,死亡現(xiàn)場離奇詭異踱蛀,居然都是意外死亡,警方通過查閱死者的電腦和手機贵白,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門率拒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人禁荒,你說我怎么就攤上這事猬膨。” “怎么了呛伴?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵勃痴,是天一觀的道長。 經(jīng)常有香客問我磷蜀,道長召耘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任褐隆,我火速辦了婚禮污它,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己衫贬,他們只是感情好德澈,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著固惯,像睡著了一般梆造。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上葬毫,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天镇辉,我揣著相機與錄音,去河邊找鬼贴捡。 笑死忽肛,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的烂斋。 我是一名探鬼主播屹逛,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼汛骂!你這毒婦竟也來了罕模?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤帘瞭,失蹤者是張志新(化名)和其女友劉穎淑掌,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體图张,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡锋拖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年诈悍,在試婚紗的時候發(fā)現(xiàn)自己被綠了祸轮。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡侥钳,死狀恐怖适袜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情舷夺,我是刑警寧澤苦酱,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站给猾,受9級特大地震影響疫萤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜敢伸,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一扯饶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦尾序、人聲如沸钓丰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽携丁。三九已至,卻和暖如春兰怠,著一層夾襖步出監(jiān)牢的瞬間梦鉴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工揭保, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留尚揣,地道東北人。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓掖举,卻偏偏與公主長得像快骗,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子塔次,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內(nèi)容