Flask與Django區別之請求勾子

Flask與Django區別之請求勾子

(1)Django功能大而全,Flask只包含基本的配置Django的一站式解決的思路,可以減少開發人員開發之前在選擇應用的基礎設施上花費的時間。

(2)Django有模板,表單,路由,認證,基本的數據庫管理等內建功能。但是Flask只是一個內核,默認依賴于兩個外部庫: Jinja2 模板引擎和 Werkzeug WSGI 工具集,其他很多功能都是以擴展的形式進行嵌入使用的。

(3)Flask比Django更靈活,可以帶給開發人員更多的靈活性。畢竟,有的應用場景不適合使用一個標準的ORM模板,需要與不同的工作流或者模板系統交互。

前提:在客戶端和服務器交互的過程中,有些準備或掃尾工作需要處理,比如在請求開始時,需要建立數據庫連接,請求結束時,需要指定數據庫的交互格式等等……

目的:為了讓每個視圖函數避免編寫具有重復功能的代碼,Flask提供了具有通用設施的功能---請求勾子。


實現形式:請求勾子已裝飾器的形式實現。

分類:Flask支持以下四種請求勾子:

(1)before_first_request?:處理第一個請求之前運行,此方法中可能作數據庫連接的操作。

(2)before_request?:每次請求之前運行。可以判斷是否是我們自己客戶端發過來的,是則不用return,否則return"非法請求"----所謂的"攔截"。

(3)after_request?:在沒有拋出錯誤的情況下,請求之后且響應發出之前運行,必須傳參:response,此方法可以對響應做統一處理,比如更改響應數據的類型Content-Type。

(4)teardown_request?:不管有木有錯誤,此方法一定會被執行。哪怕出錯,照樣執行



# -*- coding:utf-8 -*-

from flask import Flask

app = Flask(__name__)

@app.route('/')

def index():

? ? return 'index'

# 第一次請求開始前調用的,還沒有執行請求

# 作用:可以做一些初始化的操作。比如連接到數據庫

@app.before_first_request

def demo1():

? ? print 'demo1'

# 請求開始執行前調用的

# 對請求做一些校驗操作,如果請求信息有異常,或者發現自己被攻擊,可以在這里直接返回,不會進入到視圖函數中

@app.before_request

def demo2():

? ? print 'demo2'

# 請求結束之后調用的、視圖函數執行結束后調用的

# 可以接受視圖函數執行之后的響應結果

# 可以對響應進行統一的處理,比如在響應中統一設置cookie或者響應頭信息

@app.after_request

def demo3(response):

? ? print 'demo3'

? ? # 設置響應頭

? ? response.headers['Content-Type'] = 'application/json'

? ? return response

# 捕獲到服務器異常后調用的

# 可以接受異常信息,處理異常信息

@app.teardown_request

def demo4(e):

? ? print 'demo4', e

if __name__ == '__main__':

? ? app.run(debug=True)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。