0%

FastAPI自学教程(56) - 响应状态码动态调整

1.基础用法

1
2
3
4
5
6
7
8
9
10
11
from fastapi import FastAPI, Response, status

app = FastAPI()
tasks = {"foo": "Listen to the Bar Fighters"}

@app.put("/get-or-create-task/{task_id}", status_code=200)
def get_or_create_task(task_id: str, response: Response):
if task_id not in tasks:
tasks[task_id] = "New task"
response.status_code = status.HTTP_201_CREATED
return tasks[task_id]
  • 使用status_code参数声明默认状态码(装饰器级别配置)
  • 通过Response参数动态调整状态码(函数内部逻辑控制)
  • 请求处理流程:
    graph TD
      A[请求到达] --> B{资源存在?}
      B -->|存在| C[返回200状态码]
      B -->|不存在| D[创建新资源]
      D --> E[设置201状态码]
      C & E --> F[返回响应内容]

2.直接返回响应对象

1
2
3
4
5
6
7
8
9
10
11
from fastapi.responses import JSONResponse

@app.post("/items/{item_id}")
async def create_item(item_id: str):
if item_id in existing_items:
return existing_items[item_id]
new_item = {"id": item_id}
return JSONResponse(
status_code=status.HTTP_201_CREATED,
content=new_item
)
  • 直接返回JSONResponse等响应对象实例
  • 特点:
    • 完全手动控制响应内容与状态码
    • 绕过response_model的自动过滤机制
    • 必须确保返回数据格式正确性

3.进阶配置技巧

3.1 状态码常量使用

1
2
3
4
5
from fastapi import status

@app.post("/users", status_code=status.HTTP_201_CREATED)
async def create_user():
# 创建用户逻辑
  • 使用fastapi.status预定义常量提升代码可读性
  • 常用常量示例:
    • HTTP_200_OK
    • HTTP_404_NOT_FOUND
    • HTTP_500_INTERNAL_SERVER_ERROR

3.2 依赖注入系统集成

1
2
3
4
5
6
7
8
from fastapi import Depends

async def set_status(response: Response):
response.status_code = status.HTTP_202_ACCEPTED

@app.get("/process", dependencies=[Depends(set_status)])
async def long_process():
# 耗时处理逻辑
  • 在依赖项中预配置状态码
  • 适用场景:需要全局状态码调整的中间件逻辑

4.生产环境注意事项

  1. 状态码规范
    • 2xx系列用于成功操作(如201资源创建)
    • 4xx系列用于客户端错误(如404资源未找到)
    • 5xx系列仅用于服务器端错误
  2. 错误处理
    1
    2
    3
    4
    from fastapi import HTTPException
    @app.get("/secure")
    async def secure_endpoint():
    raise HTTPException(403, detail="权限不足")
  3. 文档集成
    • 通过responses参数声明额外状态码
    • 保持状态码说明与实现逻辑一致

测试命令示例:

1
2
# 测试资源创建
curl -X PUT http://localhost:8000/get-or-create-task/new_task