Flask Web Development —— 基本應(yīng)用程序結(jié)構(gòu)(上)

作者 | ipython

在這一章血筑,你將學(xué)習(xí)Flask應(yīng)用程序不同部分枚尼。同時(shí)你將編寫和運(yùn)行你的第一個(gè)Flask web應(yīng)用程序枉阵。

1、初始化

在這章技掏,你將學(xué)到Flask應(yīng)用程序的不同部分铃将。同時(shí),你將編寫和運(yùn)行你的第一個(gè)Flask web應(yīng)用程序哑梳。

所有的Flask應(yīng)用程序都必須創(chuàng)建一個(gè) 應(yīng)用程序?qū)嵗?劲阎。使用web服務(wù)器網(wǎng)關(guān)接口協(xié)議將所有從客戶端接收的請(qǐng)求傳遞給這個(gè)對(duì)象處理。這個(gè)應(yīng)用程序?qū)嵗褪荈lask類的一個(gè)對(duì)象涧衙,通常使用下面的方式創(chuàng)建:

from flask import Flask
app = Flask(__name__)

Flask類構(gòu)造函數(shù)唯一需要的參數(shù)就是應(yīng)用程序的主模塊或包哪工。對(duì)于大多數(shù)應(yīng)用程序奥此,Python的name變量就是那個(gè)正確的弧哎、你需要傳遞的值。

注:對(duì)于Flask開發(fā)者來說稚虎,傳給Flask應(yīng)用程序構(gòu)造函數(shù)的name參數(shù)是比較容易弄混淆的撤嫩。Flask使用這個(gè)參數(shù)來確定應(yīng)用程序的根目錄,這樣以后可以相對(duì)這個(gè)路徑來找到資源文件蠢终。

稍后你可以看到更復(fù)雜的應(yīng)用程序?qū)嵗跏蓟蛉粒菍?duì)于簡(jiǎn)單應(yīng)用程序這些已經(jīng)足夠了。

2寻拂、路由和視圖函數(shù)

客戶端例如web瀏覽器發(fā)送 請(qǐng)求 給web服務(wù)程奠,進(jìn)而將它們發(fā)送給Flask應(yīng)用程序?qū)嵗?yīng)用程序?qū)嵗枰缹?duì)于各個(gè)URL請(qǐng)求需要運(yùn)行哪些代碼祭钉,所以它給Python函數(shù)建立了一個(gè)URLs映射瞄沙。這些在URL和函數(shù)之間建立聯(lián)系的操作被稱之為 路由 。

在Flask應(yīng)程序中定義路由的最便捷的方式是通過顯示定義在應(yīng)用程序?qū)嵗系腶pp.route裝飾器慌核,注冊(cè)被裝飾的函數(shù)來作為一個(gè)路由距境。下面的例子會(huì)演示怎樣使用裝飾器來申明一個(gè)路由:

@app.route('/')
def index():
    return '<h1>Hello World!</h1>'

注:裝飾器是Python語言的標(biāo)準(zhǔn)特性;它們可以以不同方式改變函數(shù)的行為垮卓。一個(gè)常見的模式是使用裝飾器來注冊(cè)函數(shù)作為一個(gè)事件處理程序垫桂。

在上一個(gè)示例給應(yīng)用程序的根URL注冊(cè)index()函數(shù)作為事件的處理程序。如果這個(gè)應(yīng)用程序被部署在服務(wù)器上并綁定了 www.example.com 域名粟按,然后在你的瀏覽器地址欄中輸入 http://www.example.com 將觸發(fā)index()來運(yùn)行服務(wù)诬滩∨啵客戶端接收到的這個(gè)函數(shù)的返回值被稱為 響應(yīng) 。如果客戶端是web瀏覽器疼鸟,響應(yīng)則是顯示給用戶的文檔蒙挑。

類似于index()的函數(shù)被稱作 視圖函數(shù) 。通過視圖返回的響應(yīng)可以是簡(jiǎn)單的HTML內(nèi)容的字符串愚臀,但它也可以市更復(fù)雜的形式忆蚀,正如您將看到的。

注:響應(yīng)字符串嵌入在Python代碼中導(dǎo)致代碼難以掌控姑裂,在此只是介紹響應(yīng)的概念馋袜。你將在第三章學(xué)習(xí)正確的方法來生成響應(yīng)。

如果你注意到你每天使用的一些網(wǎng)站URLs如何形成的舶斧,你將會(huì)發(fā)現(xiàn)很多都有變量欣鳖。例如,你的Facebook個(gè)人信息頁的URL是 http://www.facebook.com/<username> 茴厉,所以你的用戶名是它的一部分泽台。Flask在路由裝飾器中使用特殊的語法支持這些類型的URLs。下面的示例定義了一個(gè)擁有動(dòng)態(tài)名稱組件的路由:

@app.route('/user/<name>') 
def user(name):
    return '<h1>Hello, %s!</h1>' % name

用尖括號(hào)括起來的部分是動(dòng)態(tài)的部分矾缓,所以任何URLs匹配到靜態(tài)部分都將映射到這個(gè)路由怀酷。當(dāng)視圖函數(shù)被調(diào)用,F(xiàn)lask發(fā)送動(dòng)態(tài)組件作為一個(gè)參數(shù)嗜闻。在前面的示例的視圖函數(shù)中蜕依,這個(gè)參數(shù)是用于生成一個(gè)個(gè)性的問候作為響應(yīng)。

在路由中動(dòng)態(tài)組件默認(rèn)為字符串琉雳,但是可以定義為其他類型样眠。例如,路由/user/<int:id>只匹配有一個(gè)整數(shù)在id動(dòng)態(tài)段的URLs翠肘。Flask路由支持int檐束、float和path。path同樣是字符串類型束倍,但并不認(rèn)為斜杠是分隔符被丧,而認(rèn)為它們是動(dòng)態(tài)組件的一部分。

3肌幽、服務(wù)啟動(dòng)

應(yīng)用程序?qū)嵗幸粋€(gè)run方法用于啟動(dòng)Flask集成的web服務(wù):

if __name__ == '__main__':
    app.run(debug=True)

name == 'main'在此處使用是用于確保web服務(wù)已經(jīng)啟動(dòng)當(dāng)腳本被立即執(zhí)行晚碾。當(dāng)腳本被另一個(gè)腳本導(dǎo)入,它被看做父腳本將啟動(dòng)不同的服務(wù)喂急,所以app.run()調(diào)用會(huì)被跳過格嘁。

一旦服務(wù)啟動(dòng),它將進(jìn)入循環(huán)等待請(qǐng)求并為之服務(wù)廊移。這個(gè)循環(huán)持續(xù)到應(yīng)用程序停止糕簿,例如通過按下Ctrl-C探入。

有幾個(gè)選項(xiàng)參數(shù)可以給app.run()配置web服務(wù)的操作模式。在開發(fā)期間懂诗,可以很方便的開啟debug模式蜂嗽,將激活 debugger 和 reloader 。這樣做是通過傳遞debug為True來實(shí)現(xiàn)的殃恒。

注:Flask提供的web服務(wù)并不用于生產(chǎn)環(huán)境植旧。你將在十七章學(xué)習(xí)生產(chǎn)環(huán)境的web服務(wù)。

4离唐、一個(gè)完整的應(yīng)用程序

在上一節(jié)病附,你學(xué)習(xí)了Flask web應(yīng)用程序的不同部分,現(xiàn)在是時(shí)候?qū)懸粋€(gè)了亥鬓。整個(gè) hello.py 應(yīng)用程序腳本只不過將前面描述的三個(gè)部分結(jié)合在一個(gè)文件中完沪。應(yīng)用程序示例2-1所示。

示例2-1 hello.py:一個(gè)完整的Flask應(yīng)用程序

from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
    return '

<h1>Hello World!</h1>

'

if __name__ == '__main__':
    app.run(debug=True)

建議:如果你有克隆在GitHub上的應(yīng)用程序嵌戈,你現(xiàn)在可以運(yùn)行g(shù)it checkout 2a來切換到這個(gè)版本的應(yīng)用程序覆积。

運(yùn)行應(yīng)用程序之前,請(qǐng)確保你在之前創(chuàng)建的虛擬環(huán)境已經(jīng)是激活狀態(tài)且已安裝Flask∈烨海現(xiàn)在打開你的web瀏覽器并在地址欄輸入 http://127.0.0.1:5000/ 宽档。圖像2-1顯示連接到應(yīng)用程序后的web瀏覽器。

圖像2-1 hello.py Flask應(yīng)用程序

然后輸入以下命令啟動(dòng)應(yīng)用程序:

(venv) $ python hello.py
 * Running on http://127.0.0.1:5000/
 * Restarting with reloader

如果你輸入任何其他URL惰拱,應(yīng)用程序?qū)⒉恢廊绾尾僮魉⑶覍⒎祷劐e(cuò)誤代碼404給瀏覽器——當(dāng)你訪問一個(gè)不存在的網(wǎng)頁也會(huì)得到該錯(cuò)誤雌贱。

示例2-2所示應(yīng)用程序的增強(qiáng)版添加了第二個(gè)動(dòng)態(tài)路由。當(dāng)你訪問這個(gè)URI偿短,你應(yīng)該可以看到一個(gè)個(gè)性的問候。

示例2-2 hello.py:帶有動(dòng)態(tài)路由的Flask應(yīng)用程序

from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
    return '

<h1>Hello World!</h1>

'

@app.route('/user/<name>')
def user(name):
    return '

<h1>Hello, %s!</h1>

' % name

if __name__ == '__main__':
    app.run(debug=True)

建議:如果你有克隆在GitHub上的應(yīng)用程序馋没,你現(xiàn)在可以運(yùn)行g(shù)it checkout 2b來切換到這個(gè)版本的應(yīng)用程序昔逗。

測(cè)試動(dòng)態(tài)路由,確保服務(wù)正在運(yùn)行隨后訪問 http://localhost:5000/user/Dave 篷朵。生成的應(yīng)用程序會(huì)使用動(dòng)態(tài)參數(shù)名響應(yīng)一個(gè)定制的問候勾怒。嘗試不同的名稱,看看視圖函數(shù)總是生成響應(yīng)基于給定的名稱声旺。圖像2-2展示的一個(gè)示例笔链。

圖像2-2 hello.py 動(dòng)態(tài)路由

原文轉(zhuǎn)自:https://segmentfault.com/a/1190000000730217

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市腮猖,隨后出現(xiàn)的幾起案子鉴扫,更是在濱河造成了極大的恐慌,老刑警劉巖澈缺,帶你破解...
    沈念sama閱讀 222,807評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坪创,死亡現(xiàn)場(chǎng)離奇詭異炕婶,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)莱预,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門柠掂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人依沮,你說我怎么就攤上這事涯贞。” “怎么了危喉?”我有些...
    開封第一講書人閱讀 169,589評(píng)論 0 363
  • 文/不壞的土叔 我叫張陵肩狂,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我姥饰,道長(zhǎng)傻谁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,188評(píng)論 1 300
  • 正文 為了忘掉前任列粪,我火速辦了婚禮审磁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘岂座。我一直安慰自己态蒂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,185評(píng)論 6 398
  • 文/花漫 我一把揭開白布费什。 她就那樣靜靜地躺著钾恢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鸳址。 梳的紋絲不亂的頭發(fā)上瘩蚪,一...
    開封第一講書人閱讀 52,785評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音稿黍,去河邊找鬼疹瘦。 笑死,一個(gè)胖子當(dāng)著我的面吹牛巡球,可吹牛的內(nèi)容都是我干的言沐。 我是一名探鬼主播,決...
    沈念sama閱讀 41,220評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼酣栈,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼险胰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起矿筝,我...
    開封第一講書人閱讀 40,167評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤起便,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缨睡,經(jīng)...
    沈念sama閱讀 46,698評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鸟悴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,767評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了奖年。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片细诸。...
    茶點(diǎn)故事閱讀 40,912評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖陋守,靈堂內(nèi)的尸體忽然破棺而出震贵,到底是詐尸還是另有隱情,我是刑警寧澤水评,帶...
    沈念sama閱讀 36,572評(píng)論 5 351
  • 正文 年R本政府宣布猩系,位于F島的核電站,受9級(jí)特大地震影響中燥,放射性物質(zhì)發(fā)生泄漏寇甸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,254評(píng)論 3 336
  • 文/蒙蒙 一疗涉、第九天 我趴在偏房一處隱蔽的房頂上張望拿霉。 院中可真熱鬧,春花似錦咱扣、人聲如沸绽淘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沪铭。三九已至,卻和暖如春偏瓤,著一層夾襖步出監(jiān)牢的瞬間杀怠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工硼补, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留驮肉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,359評(píng)論 3 379
  • 正文 我出身青樓已骇,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親票编。 傳聞我的和親對(duì)象是個(gè)殘疾皇子褪储,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,922評(píng)論 2 361

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