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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 04:45:07