如何编写兼容多Web框架的通用Python请求拦截器?
通用Web框架请求拦截器实现
要让拦截器兼容Flask、Django等多框架,核心是解耦拦截器与具体框架的请求对象依赖,通过适配器模式把请求头的获取逻辑做成可替换的组件,让拦截器只依赖统一的抽象接口。
通用拦截器核心代码
我们先写一个不绑定任何框架的通用装饰器,它接受一个get_request_headers函数作为参数——这个函数负责从当前请求上下文里提取请求头,不同框架只要实现对应的版本就行。
from functools import wraps def universal_interceptor(get_request_headers): def decorator(func): print('函数定义阶段执行的逻辑(比如初始化操作)') @wraps(func) def wrapper(*args, **kwargs): print('目标函数执行前:开始拦截') # 调用适配器函数获取请求头,完全和框架无关 headers = get_request_headers(*args, **kwargs) print(f'拦截到请求头:{headers}') # 执行原视图函数 result = func(*args, **kwargs) print('目标函数执行后:完成拦截') return result return wrapper return decorator
针对不同框架写适配器
Flask 适配器
Flask用全局request对象,直接返回它的headers即可:
from flask import request def flask_get_headers(*args, **kwargs): return request.headers
Flask中使用示例:
from flask import Flask, make_response, jsonify app = Flask(__name__) @app.route('/', methods=['GET', 'POST']) @universal_interceptor(flask_get_headers) def hello(): return make_response(jsonify({'resp': "ok done"}), 200) if __name__ == "__main__": app.run('127.0.0.1', 5000, debug=True)
Django 适配器
Django视图的第一个参数就是request对象,直接从参数里提取:
def django_get_headers(*args, **kwargs): # Django视图函数第一个参数固定是request if args: return args[0].headers return {}
Django中使用示例:
from django.http import JsonResponse @universal_interceptor(django_get_headers) def hello(request): return JsonResponse({'resp': "ok done"}, status=200)
扩展说明
- 要支持其他框架(比如FastAPI),只需要新增对应框架的
get_request_headers适配器函数即可,核心拦截逻辑完全不用改。 - 如果需要拦截更多请求信息(比如请求方法、查询参数),只需要扩展适配器的返回内容,拦截器里统一处理就行,始终保持核心逻辑与框架无关。
内容的提问来源于stack exchange,提问作者Atul D
相关产品推荐
相关产品推荐

