Flask介紹

1. 簡(jiǎn)介

Flask是一個(gè)使用Python編寫的輕量級(jí)Web應(yīng)用框架?;赪erkzeug WSGI(PythonWeb服務(wù)器網(wǎng)關(guān)接口(Python Web Server Gateway Interface,縮寫為WSGI)是Python應(yīng)用程序或框架和Web服務(wù)器之間的一種接口,已經(jīng)被廣泛接受, 它已基本達(dá)成它的可移植性方面的目標(biāo))工具箱和Jinja2 模板引擎。 Flask使用BSD授權(quán)。 Flask也被稱為“microframework”,因?yàn)樗褂煤?jiǎn)單的核心,用extension增加其他功能。Flask沒有默認(rèn)使用的數(shù)據(jù)庫、窗體驗(yàn)證工具。然而,F(xiàn)lask保留了擴(kuò)增的彈性,可以用Flask-extension加入這些功能:ORM、窗體驗(yàn)證工具、文件上傳、各種開放式身份驗(yàn)證技術(shù)。

小插曲
Flask 的作者是 Armin Ronacher(他也是 Werkzeug 及 Jinja2 的作者。)。本來只是作者的一個(gè)愚人節(jié)玩笑,不過后來大受歡迎,進(jìn)而成為一個(gè)正式的項(xiàng)目。


2. Flask的安裝

和大多數(shù)的Python第三方模塊的安裝方法一樣,F(xiàn)lask可以直接通過pip來安裝

pip install flask

3. 一個(gè)最小的Flask應(yīng)用

  • 代碼
from flask import Flask
app = Flask(__name__)
 
@app.route("/")
def hello():
    return "Hello World!"
 
if __name__ == "__main__":
    app.run()
  • 運(yùn)行
python hello.py
深度截圖20161208135148.png
深度截圖20161208135255.png
  • 代碼解釋

首先我們導(dǎo)入了 Flask 類。
接著我們創(chuàng)建了這個(gè)類的實(shí)例。第一個(gè)參數(shù)是應(yīng)用模塊或者包的名稱。
然后我們使用 route() 裝飾器來告訴 Flask 觸發(fā)函數(shù)的 URL 。
函數(shù)名稱可用于生成相關(guān)聯(lián)的 URL ,并返回需要在用戶瀏覽器中顯示的信息。
最后,使用 run() 函數(shù)來運(yùn)行本地服務(wù)器和我們的應(yīng)用。 if name =='main':
確保服務(wù)器只會(huì)在使用 Python 解釋器運(yùn)行代碼的 情況下運(yùn)行,而不會(huì)在作為模塊導(dǎo)入時(shí)運(yùn)行。
按 control-C 可以停止服務(wù)器


4. Flask 框架分析

為了理解 Flask 框架是如何抽象出Web開發(fā)中的共同部分,我們先來看看Web應(yīng)用程序的一般流程。對(duì)于Web應(yīng)用來說,當(dāng)客戶端想要獲取 動(dòng)態(tài)資源 時(shí),就會(huì)發(fā)起一個(gè)HTTP請(qǐng)求(比如用瀏覽器訪問一個(gè) URL),Web應(yīng)用程序會(huì)在后臺(tái)進(jìn)行相應(yīng)的業(yè)務(wù)處理,(從數(shù)據(jù)庫或者進(jìn)行一些計(jì)算操作等)取出用戶需要的數(shù)據(jù),生成相應(yīng)的HTTP響應(yīng)(當(dāng)然,如果訪問靜態(tài)資源,則直接返回資源即可,不需要進(jìn)行業(yè)務(wù)處理)。整個(gè)處理過程如下圖所示:


實(shí)際應(yīng)用中, 不同的請(qǐng)求可能會(huì)調(diào)用相同的處理邏輯 。這里有著相同業(yè)務(wù)處理邏輯的 HTTP 請(qǐng)求可以用一類 URL 來標(biāo)識(shí)。比如論壇站點(diǎn)中,對(duì)于所有的獲取Topic內(nèi)容的請(qǐng)求而言,可以用 topic/<topic_id>/ 這類URL來表示,這里的 topic_id 用以區(qū)分不同的topic。接著在后臺(tái)定義一個(gè) get_topic(topic_id) 的函數(shù),用來獲取topic相應(yīng)的數(shù)據(jù),此外還需要建立URL和函數(shù)之間的一一對(duì)應(yīng)關(guān)系。這就是Web開發(fā)中所謂的 路由分發(fā) ,如下圖所示:

Flask底層使用 werkzeug 來做路由分發(fā),代碼寫起來十分簡(jiǎn)單,如下:

@app.route('/topic/<int:topic_id>/') 
def get_topic(topic_id):
  # Do some cal or read from database
  # Get the data we need.

通過業(yè)務(wù)邏輯函數(shù)拿到數(shù)據(jù)后,接下來需要根據(jù)這些數(shù)據(jù)生成HTTP響應(yīng)(對(duì)于Web應(yīng)用來說,HTTP響應(yīng)一般是一個(gè)HTML文件)。Web開發(fā)中的一般做法是提供一個(gè)HTML模板文件,然后將數(shù)據(jù)傳入模板,經(jīng)過渲染后得到最終需要的HTML響應(yīng)文件。
一種比較常見的場(chǎng)景是, 請(qǐng)求雖然不同,但響應(yīng)中數(shù)據(jù)的展示方式是相同的 。仍以論壇為例,對(duì)不同topic而言,其具體topic content雖然不同,但頁面展示的方式是一樣的,都有標(biāo)題攔,內(nèi)容欄等。也就是說,對(duì)于 topic 來說,我們只需提供一個(gè)HTML模板,然后傳入不同topic數(shù)據(jù),即得到不同的HTTP響應(yīng)。這就是所謂的 模板渲染 ,如下圖所示:


Flask 使用 Jinja2 模板渲染引擎來做模板渲染,代碼如下:

@app.route('/topic/<int:topic_id>/')
def get_topic(topic_id):
  # Do some cal or read from database
  return render_template('path/to/template.html', data)

總結(jié)一下,F(xiàn)lask處理一個(gè)請(qǐng)求的流程就是,首先根據(jù) URL 決定由那個(gè)函數(shù)來處理,然后在函數(shù)中進(jìn)行操作,取得所需的數(shù)據(jù)。再將數(shù)據(jù)傳給相應(yīng)的模板文件中,由Jinja2 負(fù)責(zé)渲染得到 HTTP 響應(yīng)內(nèi)容,然后由Flask返回響應(yīng)內(nèi)容。


5. Flask的擴(kuò)展

Flask是一個(gè)微型框架,自身沒有提供數(shù)據(jù)庫管理,表單驗(yàn)證,cookie處理等功能,很多功能需要通過擴(kuò)展才能實(shí)現(xiàn)

  • Flask-sqlalchemy # 數(shù)據(jù)庫管理
  • Flask-script # Flask-Script 為Flask程序添加了一個(gè)命令行解析, 自帶了一組常用選項(xiàng),而且還支持自定義命令。
  • Flask-wtform # 表單驗(yàn)證
  • Flask-login # 登陸管理
    ......

可以在這個(gè)網(wǎng)站上尋找更多Flask的擴(kuò)展的安裝和使用方法
http://flask.pocoo.org/extensions/


6. 主頁

更多關(guān)于Flask的內(nèi)容請(qǐng)到Flask的官網(wǎng)
http://flask.pocoo.org/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容