
為了理解 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ù)庫(kù)或者進(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// 這類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)單,如下:
通過業(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雖然不同,但頁(yè)面展示的方式是一樣的,都有標(biāo)題攔,內(nèi)容欄等。也就是說,對(duì)于 topic 來說,我們只需提供一個(gè)HTML模板,然后傳入不同topic數(shù)據(jù),即得到不同的HTTP響應(yīng)。這就是所謂的 模板渲染 ,如下圖所示:
Flask 使用 Jinja2 模板渲染引擎來做模板渲染,代碼如下:
總結(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)容。
Flask也被稱為 “microframework” ,因?yàn)樗褂煤?jiǎn)單的核心,用 extension。增加其他功能。
Flask沒有默認(rèn)使用的數(shù)據(jù)庫(kù)、窗體驗(yàn)證工具。然而,F(xiàn)lask保留了擴(kuò)增的彈性,可以用Flask-extension加入這些功能:ORM、窗體驗(yàn)證工具、文件上傳、各種開放式身份驗(yàn)證技術(shù)。最新版本為0.11。 Flask是一個(gè)使用 Python 編寫的輕量級(jí) Web 應(yīng)用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎則使用 Jinja2 。Flask使用 BSD 授權(quán)。 flask默認(rèn)端口是5000。 Flask簡(jiǎn)單易學(xué),下面是Flask版的hello world(hello.py):
from flask import Flaskapp = Flask(__name__)@app.route("/")def hello(): return "Hello World!"if __name__ == "__main__": app.run()重定向和錯(cuò)誤 你可以用 redirect() 函數(shù)把用戶重定向到其它地方。放棄請(qǐng)求并返回錯(cuò)誤代碼,用 abort()函數(shù)。這里是一個(gè)它們?nèi)绾问褂玫睦?from flask import abort, redirect, url_for@app.route('/')def index(): return redirect(url_for('login'))@app.route('/login')def login(): abort(401) this_is_never_executed()這是一個(gè)相當(dāng)無意義的例子因?yàn)橛脩魰?huì)從主頁(yè)重定向到一個(gè)不能訪問的頁(yè)面 (401 意味著禁止訪問),但是它展示了重定向是如何工作的。
默認(rèn)情況下,錯(cuò)誤代碼會(huì)顯示一個(gè)黑白的錯(cuò)誤頁(yè)面。如果你要定制錯(cuò)誤頁(yè)面, 可以使用 errorhandler() 裝飾器:
from flask import render_template@app.errorhandler(404)def page_not_found(error): return render_template('page_not_found.html'), 404注意 render_template() 調(diào)用之后的 404 。這告訴 Flask,該頁(yè)的錯(cuò)誤代碼是 404 ,即沒有找到。默認(rèn)為 200,也就是一切正常。
是JSON格式的數(shù)據(jù),是經(jīng)過Flask框架的 jsonify模塊格式化過的數(shù)據(jù)。return jsonify(nodes=data[0], links=data[1])學(xué)習(xí)參考: 【1】快速入門:http://docs.jinkan.org/docs/flask/quickstart.html 【2】官網(wǎng):http://flask.pocoo.org/ 【3】圖文快速講解: http://www.open-open.com/lib/view/open1477879623923.html
新聞熱點(diǎn)
疑難解答
網(wǎng)友關(guān)注