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)