高阶函数编写中间件的核心是用函数接收“下一个处理函数”作为参数并返回新函数,在其中插入前置与后置逻辑;它本质是函数工厂,通过闭包实现,支持嵌套组合,兼容WSGI、Flask、Django等框架。

高阶函数编写中间件的核心是:用函数接收“下一个处理函数”作为参数,返回一个新的可调用对象(函数),在其中插入前置、后置逻辑。它不依赖框架类结构,轻量、通用、易于组合。
中间件本质是一个函数工厂
中间件不是某种特殊语法,而是典型的高阶函数模式:输入一个处理函数(如 get_response 或 handler),输出一个增强后的处理函数。执行时,它先做预处理 → 调用原函数 → 再做后处理。
- 输入:一个能处理请求并返回响应的函数(即“链中下一个环节”)
- 输出:一个新函数,封装了原函数,并在其前后插入自定义逻辑
- 调用时:该新函数接收请求,按需修改 → 交给原函数 → 拿到响应 → 按需修改 → 返回
基础写法:闭包实现的中间件
这是最贴近原理的写法,适用于任何支持函数一等公民的 Python 环境(包括裸 WSGI、自研路由、或适配 Flask/Django 的底层):
def logging_middleware(get_response):
def middleware(request):
print(f"[LOG] Request to {request.path}")
response = get_response(request) # 调用下游
print(f"[LOG] Response status: {response.status_code}")
return response
return middleware使用时,只需把视图函数包一层:
# 假设 view_func 是原始视图 wrapped_view = logging_middleware(view_func)
支持多层嵌套与顺序控制
多个中间件可通过嵌套调用自然串联,顺序由包裹顺序决定(最外层最先执行):
def auth_middleware(get_response):
def middleware(request):
if not request.user.is_authenticated:
return HttpResponse("Unauthorized", status=401)
return get_response(request)
return middleware
<h1>组合:先鉴权,再记录日志</h1><p>app_handler = logging_middleware(auth_middleware(actual_view))等价于:
- 收到请求 → 进入 logging_middleware(前置)
- 调用 auth_middleware → 执行鉴权逻辑
- 若通过,调用 actual_view;否则直接返回 401
- 无论是否短路,只要拿到响应,logging_middleware 后置逻辑都会执行
兼容主流框架的适配技巧
虽然高阶函数写法通用,但接入不同框架需注意调用约定:
-
Django:其
__call__中间件类底层也是靠类似闭包机制驱动,可直接将高阶函数转为类(__init__接收get_response,__call__实现逻辑) -
Flask:没有原生中间件注册点,但可在
app.wsgi_app上包装,或用装饰器模拟:@app.before_request/@app.after_request本质就是高阶函数思想的简化版 -
WSGI 应用:直接包装
application(environ, start_response)函数,是最自然的高阶函数应用场景
例如 WSGI 层加头:
def add_header_middleware(app):
def middleware(environ, start_response):
def custom_start_response(status, headers, exc_info=None):
headers.append(('X-Powered-By', 'Custom-Middleware'))
return start_response(status, headers, exc_info)
return app(environ, custom_start_response)
return middleware关键注意事项
写高阶函数中间件时,几个细节容易出错:
- 必须确保 始终返回响应对象,不能遗漏
return;短路逻辑(如鉴权失败)要主动构造并返回响应 - 避免在闭包内修改外部变量引发状态污染,每个中间件实例应保持独立
- 错误处理建议用
try/except包裹get_response(request),便于统一捕获下游异常 - 若需访问请求/响应的深层属性(如 Django 的
request.user),需确认上游已设置好,否则可能 AttributeError

















