Flask 中 before_request
和 after_request
是用于实现统一请求前后处理逻辑的钩子函数。记录其使用方式和常见场景。
一、before_request
- 在每次请求处理之前执行
- 适合做权限校验、参数预处理、请求计时等
示例:
from flask import Flask, request, g
app = Flask(__name__)
@app.before_request
def before():
g.start_time = time.time()
token = request.headers.get('Authorization')
if not token or token != 'my-token':
return '权限不足', 401
二、after_request
- 在视图函数处理完成,响应生成后执行
- 适合做统一响应格式包装、添加响应头、日志记录等
示例:
@app.after_request
def after(response):
duration = time.time() - g.start_time
response.headers['X-Duration'] = str(duration)
return response
三、结合使用示例
import time
from flask import Flask, request, g, jsonify
app = Flask(__name__)
@app.before_request
def before():
g.start_time = time.time()
# 简单权限检查
token = request.headers.get('Authorization')
if not token or token != 'my-token':
return jsonify({"error": "Unauthorized"}), 401
@app.after_request
def after(response):
duration = time.time() - g.start_time
response.headers['X-Duration'] = str(duration)
return response
@app.route('/hello')
def hello():
return jsonify({"message": "hello"})
四、注意事项
before_request
返回非None
时,后续请求处理会被终止after_request
必须返回响应对象,否则会报错- 可以定义多个钩子,执行顺序为注册顺序
五、小结
before_request
和 after_request
钩子方便做全局统一处理,减少重复代码,适合请求权限、统一日志、响应封装等场景。