You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写兼容多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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 05:31:11