flask請求鉤子
Flask的請求鉤子指的是在執行視圖函數前後執行的一些函數,我們可以在這些函數裏面做一些操作。
Flask利用裝飾器給我們提供了四種鉤子函數。
before_first_request:在處理第一個請求前執行。比如鏈接數據庫操作
before_request:在每次請求前執行。比如權限校驗
after_request:每次請求之後調用,前提是沒有未處理的異常拋出
teardown_request:每次請求之後調用,即使有未處理的異常拋出
Flask裏面的鉤子跟Django裏面的中間件類似。
在第一次請求之前運行
@app.before_first_request
def before_first_request():
print('before_first_request")
在每一次請求前都會執行
@app.before_request
def before_request():
print('before_request')
在請求之後運行
@app.after_request
def after_request(response):
# response: 就是前面的請求處理完畢之後, 返回的響應數據,前提是視圖函數沒有出現異常
# 如果需要對響應做額外處理,可以再這裏進行
# json.dumps 配置請求鉤子
# response.headers["Content-Type"] = "application/json"
print('after_request')
return response
無論視圖函數是否出現異常,每一次請求之後都會調用,會接受一個參數,參數是服務器出現的錯誤信息
@app.teardown_request
def teardown_request(error):
print('teardown_request: error %s' % error)
我們在瀏覽器第一次訪問:
before_first_reques
t before_request
視圖函數執行
after_reques
t teardown_request:
error None
我們在刷新瀏覽器試一下:
before_request
視圖函數執行
after_request
teardown_request: error None
上下文
request 和 session 都屬於請求上下文對象。
request:封裝了HTTP請求的內容,針對的是http請求。舉例:user = request.args.get(‘user’),獲取的是get請求的參數。
session:用來記錄請求會話中的信息,針對的是用戶信息。舉例:session[‘name’] = user.id,可以記錄用戶信息。還可以通過session.get(‘name’)獲取用戶信息。
請求上下文
將初始的初始request封裝RequestContext對象ctx
def request_context(self, environ):
return RequestContext(self, environ)
藉助LocalStack對象將ctx放到Local對象中
_request_ctx_stack = LocalStack()
_request_ctx_stack.push(self)
導入from flask import request,其中request對象是LocalProxy類的實例化對象
request = LocalProxy(partial(_lookup_req_object, 'request'))
應用上下文
from flask import g:在一次請求週期裏,用於存儲的變量,便於程序員傳遞變量的時候使用。
g變量是解決我們在一次請求過程傳遞參數的問題,我們可以往g變量塞很多屬性,在同一次請求中,可以從另一個函數中取出。當然也可以用函數參數這種方法解決,g變量適用於參數多的情況。
藍圖
使用裝飾器解決
例如我們把上面的home視圖抽出來,放到單獨的一個home.py文件中。在此文件只寫一個沒有被裝飾器裝飾的視圖函數。
def home():
return 'home page'
然後在Flask的啓動程序文件中,把home視圖在重新用裝飾器裝飾起來。
from home import home
# 裝飾home視圖
app.route('/home')(home)
什麼是藍圖
藍圖:用於實現單個應用的視圖、模板、靜態文件的集合。
藍圖就是模塊化處理的類。
簡單來說,藍圖就是一個存儲操作路由映射方法的容器,主要用來實現客戶端請求和URL相互關聯的功能。 在Flask中,使用藍圖可以幫助我們實現模塊化應用的功能。
Flask中的藍圖有點像Django框架的app的意思。就是把一個項目模塊化,每個模塊所用的視圖、靜態文件、模板放在一個盒子裏。
使用藍圖
在使用藍圖之前,我們需要先創建藍圖,繼續那我們上面的home視圖函數舉例,把home.py文件裏面的代碼修改如下:
from flask import Blueprint
# app_home值藍圖的名稱,
# __name__指藍圖所在模塊
app_home = Blueprint('app_home', __name__)
# 註冊藍圖路由
@app_home.route('/home')
def home():
return 'home page'
Flask的啓動程序文件中,導入藍圖並註冊藍圖:
#導入藍圖
from home import app_home
# 註冊藍圖
app.register_blueprint(app_home)
在Flask中用url_prefix可以給藍圖模塊添加一個共同的地址。
app.register_blueprint(app_home, url_prefix='/user')
以藍圖模塊導入
把Flask中的藍圖用python中包的概念管理起來。
在__init__.py文件中創建藍圖:
from flask import Blueprint
# app_home值藍圖的名稱,
# __name__指藍圖所在模塊
app_home = Blueprint('app_home', __name__)
from .views import home
在views.py文件中註冊藍圖路由:
from . import app_home
# 註冊藍圖路由
@app_home.route('/home')
def home():
return 'home page'
在Flask啓動文件導入藍圖:
from flask import Flask
# 導入藍圖
from home import app_home
app = Flask(__name__)
# 註冊藍圖 app.register_blueprint(app_home, url_prefix='/user')
@app.route('/')
def index():
return 'index page'
if __name__ == '__main__':
# 0.0.0.0代表任何能代表這臺機器的地址都可以訪問 app.run(host='0.0.0.0', port=5000, debug=True) # 運行程序
我們修改一下home的視圖函數,改成加載模板:
from . import app_home
from flask import render_template
# 註冊藍圖路由
@app_home.route('/home')
def home():
return render_template('home.html')
二、g對象
g:global
- g對象是專門用來保存用戶的數據的。
- g對象在一次請求中的所有的代碼的地方,都是可以使用的。