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

如何为FastAPI的non-async def端点应用中间件?

关于FastAPI异步中间件作用于同步端点的问题

完全可以正常工作,不需要做任何额外修改。

FastAPI底层依赖的Starlette框架会自动处理同步端点的适配——当你用def定义同步端点时,Starlette会把它包装成一个可被await的异步对象,所以在异步中间件里调用await call_next(request)时,不管后续的端点是同步还是异步的,都能正确执行并获取响应。

拿你给出的中间件代码举例:

@app.middleware("http")
async def add_process_time_header(request: Request, call_next):
    start_time = time.time()
    response = await call_next(request)
    process_time = time.time() - start_time
    response.headers["X-Process-Time"] = str(process_time)
    return response

就算后续的call_next指向一个同步端点(比如下面这个):

@app.get("/sync")
def sync_handler():
    time.sleep(0.5)  # 模拟同步耗时操作
    return {"status": "ok"}

访问这个端点时,响应头里的X-Process-Time依然会准确计算从中间件开始到响应返回的总耗时(包含同步端点的0.5秒),中间件完全能正常发挥作用。

总结一下:FastAPI的异步中间件对同步、异步端点都兼容,不需要针对同步端点单独修改中间件代码。

内容的提问来源于stack exchange,提问作者zhfkt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 02:16:14