如何为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
相关产品推荐
相关产品推荐

