從零開始搭建論壇(三):Flask框架簡單介紹
前面兩篇文章中我們已經(jīng)了解 Web(HTTP)服務(wù)器,Web應用程序,Web框架,WSGI這些 Python Web 開發(fā)中的概念。我們知道,Web框架通過將不同Web應用程序中的共性部分給抽象出來,提供一系列通用的接口,從而避免開發(fā)者做重復性工作,讓其將精力放在業(yè)務(wù)相關(guān)的實現(xiàn)。
接下來一起來看一個具體的 Web 框架,這里選擇 Flask,因為它是一個年輕充滿活力的微框架,有著眾多的擁護者,文檔齊全,社區(qū)活躍度高。我們的論壇項目 就使用了該框架。
Flask 框架
為了理解 Flask 框架是如何抽象出Web開發(fā)中的共同部分,我們先來看看Web應用程序的一般流程。對于Web應用來說,當客戶端想要獲取動態(tài)資源時,就會發(fā)起一個HTTP請求(比如用瀏覽器訪問一個 URL),Web應用程序會在后臺進行相應的業(yè)務(wù)處理,(從數(shù)據(jù)庫或者進行一些計算操作等)取出用戶需要的數(shù)據(jù),生成相應的HTTP響應(當然,如果訪問靜態(tài)資源,則直接返回資源即可,不需要進行業(yè)務(wù)處理)。整個處理過程如下圖所示:
實際應用中,不同的請求可能會調(diào)用相同的處理邏輯。這里有著相同業(yè)務(wù)處理邏輯的 HTTP 請求可以用一類 URL 來標識。比如論壇站點中,對于所有的獲取Topic內(nèi)容的請求而言,可以用 topic/<topic_id>/ 這類URL來表示,這里的 topic_id 用以區(qū)分不同的topic。接著在后臺定義一個 get_topic(topic_id) 的函數(shù),用來獲取topic相應的數(shù)據(jù),此外還需要建立URL和函數(shù)之間的一一對應關(guān)系。這就是Web開發(fā)中所謂的路由分發(fā),如下圖所示:
Flask底層使用werkzeug來做路由分發(fā),代碼寫起來十分簡單,如下:
- @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響應(對于Web應用來說,HTTP響應一般是一個HTML文件)。Web開發(fā)中的一般做法是提供一個HTML模板文件,然后將數(shù)據(jù)傳入模板,經(jīng)過渲染后得到最終需要的HTML響應文件。
一種比較常見的場景是,請求雖然不同,但響應中數(shù)據(jù)的展示方式是相同的。仍以論壇為例,對不同topic而言,其具體topic content雖然不同,但頁面展示的方式是一樣的,都有標題攔,內(nèi)容欄等。也就是說,對于 topic 來說,我們只需提供一個HTML模板,然后傳入不同topic數(shù)據(jù),即得到不同的HTTP響應。這就是所謂的模板渲染,如下圖所示:
Flask 使用 Jinja2 模板渲染引擎來做模板渲染,代碼如下:
- @app.route('/topic/<int:topic_id>/')
- def get_topic(topic_id):
- # Do some cal or read from database
- # Get the data we need.
- return render_template('path/to/template.html', data_needed)
總結(jié)一下,F(xiàn)lask處理一個請求的流程就是,首先根據(jù) URL 決定由那個函數(shù)來處理,然后在函數(shù)中進行操作,取得所需的數(shù)據(jù)。再將數(shù)據(jù)傳給相應的模板文件中,由Jinja2 負責渲染得到 HTTP 響應內(nèi)容,然后由Flask返回響應內(nèi)容。
Flask 入門
關(guān)于 Flask 框架的學習,不建議直接讀官網(wǎng)文檔,雖然這是一手的權(quán)威資料,但并不適合初學者入手。這里推薦幾個學習資料,可以幫助新手很快的入門:
匯智網(wǎng)flask框架教程:一個非常適合入門的精簡教程,主要分為七部分:
- 快速入門
- 路由:URL 規(guī)則與視圖函數(shù)
- 請求、應答與會話
- 上下文對象:Flask 核心機制
- 模版:分離數(shù)據(jù)與視圖
- 訪問數(shù)據(jù)庫:SQLAlchemy簡介
- 藍圖:Flask應用組件化
教程簡練地總結(jié)了 Flask 最核心的內(nèi)容,并且還提供了一個簡單的在線練習環(huán)境,方便一邊學習理論一邊動手實踐。
此外,麥子學院也有一個 Flask入門 視頻教程,一共8小時的視頻教程,涵蓋flask web 開發(fā)的方方面面,包括環(huán)境的搭建,flask 語法介紹,項目結(jié)構(gòu)的組織,flask 全球化,單元測試等內(nèi)容。視頻作者有 17 年軟件開發(fā)經(jīng)驗,曾任微軟深圳技術(shù)經(jīng)理及多家海外機構(gòu)擔任技術(shù)顧問,夠牛!視頻講的也確實不錯。
如果上面兩個不能滿足你,那么還可以看 Flask Web開發(fā):基于Python的Web應用開發(fā)實戰(zhàn) 這本有著 8.6 評分的書,相信沒看完就躍躍欲試想寫點什么了。這么優(yōu)秀的框架,Github 上當然也有 awesome-flask了,想深入學習flask的話,這里不失為一個好的資源帖。
本篇大概談了下 Flask 的路由分發(fā)和模版渲染,下篇我們會繼續(xù)講Flask使用中的一些問題。