FastAPI如何在路由函数内打印PUT请求的HTTP响应状态码
FastAPI路由内获取响应状态码解决方案
问题根因
- 路由函数执行阶段,FastAPI还未将
@app.put装饰器中传入的status_code参数绑定到注入的Response实例上,因此直接读取response.status_code会得到None - 原代码中
print(status_code)属于变量引用错误,status_code未在函数作用域内定义,运行会抛出NameError
可行实现方案
方案1:复用预定义状态码常量(固定状态码场景)
如果当前接口返回状态码固定,直接将装饰器传入的状态码定义为常量复用即可:
from fastapi import FastAPI, Request, Response, status import logging app = FastAPI() logger = logging.getLogger(__name__) # 预定义状态码常量 USER_PUT_OK_STATUS = status.HTTP_200_OK @app.put('/user/{id}', status_code=USER_PUT_OK_STATUS) async def processing(id: str, request: Request, response: Response): data = await request.json() # 直接使用常量即可 current_status = USER_PUT_OK_STATUS print(current_status) logger.info("Got response [%s]", current_status) return data
方案2:手动赋值状态码(动态修改状态码场景)
如果需要根据业务逻辑调整返回状态码,先手动给response.status_code赋值后再读取即可:
@app.put('/user/{id}') async def processing(id: str, request: Request, response: Response): data = await request.json() # 根据业务逻辑动态设置状态码 if not id.isdigit(): response.status_code = status.HTTP_400_BAD_REQUEST else: response.status_code = status.HTTP_200_OK # 此时读取的状态码为实际返回值 current_status = response.status_code print(current_status) logger.info("Got response [%s]", current_status) return data
方案3:全局中间件统一记录(全接口日志场景)
如果需要给所有接口统一记录响应状态码,无需逐个修改路由,直接加全局中间件即可,中间件执行时路由逻辑已处理完成,状态码已完成绑定:
@app.middleware("http") async def log_all_response_status(request: Request, call_next): response = await call_next(request) logger.info("请求路径:%s,响应状态码:%s", request.url.path, response.status_code) return response
内容的提问来源于stack exchange,提问作者uk_butterfly
相关产品推荐
相关产品推荐

