Flask 中 before_requestafter_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_requestafter_request 钩子方便做全局统一处理,减少重复代码,适合请求权限、统一日志、响应封装等场景。