為了理解flask框架是如何抽象出web開發中的共同部分,我們先來看看web應用程式的一般流程。對於web應用來說,當客戶端想要獲取動態資源 時,就會發起乙個http請求(比如用瀏覽器訪問乙個 url),web應用程式會在後台進行相應的業務處理,(從資料庫或者進行一些計算操作等)取出使用者需要的資料,生成相應的http響應(當然,如果訪問靜態資源,則直接返回資源即可,不需要進行業務處理)。整個處理過程如下圖所示:
實際應用中, 不同的請求可能會呼叫相同的處理邏輯 。這裡有著相同業務處理邏輯的 http 請求可以用一類 url 來標識。比如論壇站點中,對於所有的獲取topic內容的請求而言,可以用 topic// 這類url來表示,這裡的 topic_id 用以區分不同的topic。接著在後台定義乙個 get_topic(topic_id) 的函式,用來獲取topic相應的資料,此外還需要建立url和函式之間的一一對應關係。這就是web開發中所謂的路由分發,如下圖所示:
flask底層使用 werkzeug 來做路由分發,**寫起來十分簡單,如下:
defget_topic(topic_id):
# do some cal or read from database
# get the data we need.
通過業務邏輯函式拿到資料後,接下來需要根據這些資料生成http響應(對於web應用來說,http響應一般是乙個html檔案)。web開發中的一般做法是提供乙個html模板檔案,然後將資料傳入模板,經過渲染後得到最終需要的html響應檔案。
一種比較常見的場景是, 請求雖然不同,但響應中資料的展示方式是相同的 。仍以論壇為例,對不同topic而言,其具體topic content雖然不同,但頁面展示的方式是一樣的,都有標題攔,內容欄等。也就是說,對於 topic 來說,我們只需提供乙個html模板,然後傳入不同topic資料,即得到不同的http響應。這就是所謂的 模板渲染 ,如下圖所示:
flask 使用 jinja2 模板渲染引擎來做模板渲染,**如下:
defget_topic(topic_id):
# do some cal or read from database
# get the data we need.
returnrender_template('path/to/template.html', data_needed)
總結一下,flask處理乙個請求的流程就是,首先根據 url 決定由那個函式來處理,然後在函式中進行操作,取得所需的資料。再將資料傳給相應的模板檔案中,由jinja2 負責渲染得到 http 響應內容,然後由flask返回響應內容。
from flask import flask
defhello
():return
"hello world!"
if __name__ == "__main__":
from flask import abort, redirect, url_for這是乙個相當無意義的例子因為使用者會從主頁重定向到乙個不能訪問的頁面 (401 意味著禁止訪問),但是它展示了重定向是如何工作的。defindex
():return redirect(url_for('login'))
deflogin
(): abort(401)
this_is_never_executed()
預設情況下,錯誤**會顯示乙個黑白的錯誤頁面。如果你要定製錯誤頁面, 可以使用 errorhandler() 裝飾器:
from flask import render_template
defpage_not_found
(error):
return render_template('page_not_found.html'), 404
注意 render_template() 呼叫之後的 404 。這告訴 flask,該頁的錯誤**是 404 ,即沒有找到。預設為 200,也就是一切正常。
return jsonify(nodes=data[0], links=data[1])
學習參考:
快速入門:
官網:**快速講解:
Flask學習 5 mysql基礎
未利用資料庫連線池 import pymysql db pymysql.connect host 127.0.0.1 user root port 3306,password 111111 db test cursor db.cursor 建立字典游標 cursor db.cursor pymysq...
Python學習 Flask框架和jinja2模板
from flask import flask from flask import request defhome return def signin form return defsignin 需要從request物件讀取表單內容 if request.form username admin an...
python學習筆記 flask之request
from flask import request coding utf 8 from flask import flask,request def index 訪問上面定義的路徑就是訪問此方法 請求行 print request.method request.method 獲取請求方法 print...