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

如何在FastAPI中自定义ReDoc OpenAPI文档的响应消息?

FastAPI自定义ReDoc响应码及描述配置方法

要在ReDoc中显示自定义的响应码和描述,你可以通过FastAPI路由的responses参数逐个配置,或者通过自定义OpenAPI Schema实现全局统一配置,以下是具体实现方案:

一、单个路由配置响应码及描述

修改代码,在每个路由装饰器中添加responses参数定义状态码和对应描述,同时补充异常抛出逻辑让接口实际返回对应状态码:

from fastapi import FastAPI, HTTPException, status
from pydantic import BaseModel
import uvicorn

app = FastAPI()

class User(BaseModel):
    username: str

user_list = ["John", "Abrahim", "Kiana"]

# Get方法:获取用户
@app.get('/user/{id}/', responses={
    status.HTTP_200_OK: {"description": "一切正常,请求执行符合预期。"},
    status.HTTP_400_BAD_REQUEST: {"description": "请求不可接受,通常因缺少必填参数。"},
    status.HTTP_401_UNAUTHORIZED: {"description": "未提供有效的API密钥。"},
    status.HTTP_403_FORBIDDEN: {"description": "API密钥无权限执行该请求。"},
    status.HTTP_404_NOT_FOUND: {"description": "请求的资源不存在。"},
    status.HTTP_429_TOO_MANY_REQUESTS: {"description": "请求过于频繁,建议采用指数退避策略。"},
    status.HTTP_500_INTERNAL_SERVER_ERROR: {"description": "服务器端出现错误(此类情况较少见)。"}
})
def users(id: int):
    if id < 0 or id >= len(user_list):
        raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="请求的资源不存在。")
    return user_list[id]

# Post方法:添加用户
@app.post('/user', responses={
    status.HTTP_200_OK: {"description": "一切正常,请求执行符合预期。"},
    status.HTTP_400_BAD_REQUEST: {"description": "请求不可接受,通常因缺少必填参数。"},
    status.HTTP_401_UNAUTHORIZED: {"description": "未提供有效的API密钥。"},
    status.HTTP_402_PAYMENT_REQUIRED: {"description": "参数合法但请求执行失败。"},
    status.HTTP_403_FORBIDDEN: {"description": "API密钥无权限执行该请求。"},
    status.HTTP_409_CONFLICT: {"description": "请求与其他请求冲突(可能因使用相同幂等键)。"},
    status.HTTP_429_TOO_MANY_REQUESTS: {"description": "请求过于频繁,建议采用指数退避策略。"},
    status.HTTP_500_INTERNAL_SERVER_ERROR: {"description": "服务器端出现错误(此类情况较少见)。"}
})
def add_user(request: User):
    if request.username in user_list:
        raise HTTPException(status_code=status.HTTP_409_CONFLICT, detail="请求与其他请求冲突(可能因使用相同幂等键)。")
    user_list.append(request.username)
    return request.username

if __name__ == "__main__":
    uvicorn.run(app, host="127.0.0.1", port=8000)

二、全局统一配置响应码(复用性更高)

如果多个路由需要重复使用相同的响应码描述,可以通过自定义OpenAPI Schema全局配置,避免重复代码:

from fastapi import FastAPI, HTTPException, status
from pydantic import BaseModel
import uvicorn
from fastapi.openapi.utils import get_openapi

app = FastAPI()

# 定义全局通用响应码描述
COMMON_RESPONSES = {
    status.HTTP_200_OK: {"description": "一切正常,请求执行符合预期。"},
    status.HTTP_400_BAD_REQUEST: {"description": "请求不可接受,通常因缺少必填参数。"},
    status.HTTP_401_UNAUTHORIZED: {"description": "未提供有效的API密钥。"},
    status.HTTP_402_PAYMENT_REQUIRED: {"description": "参数合法但请求执行失败。"},
    status.HTTP_403_FORBIDDEN: {"description": "API密钥无权限执行该请求。"},
    status.HTTP_404_NOT_FOUND: {"description": "请求的资源不存在。"},
    status.HTTP_409_CONFLICT: {"description": "请求与其他请求冲突(可能因使用相同幂等键)。"},
    status.HTTP_429_TOO_MANY_REQUESTS: {"description": "请求过于频繁,建议采用指数退避策略。"},
    status.HTTP_500_INTERNAL_SERVER_ERROR: {"description": "服务器端出现错误(此类情况较少见)。"},
    status.HTTP_502_BAD_GATEWAY: {"description": "服务器端出现错误(此类情况较少见)。"},
    status.HTTP_503_SERVICE_UNAVAILABLE: {"description": "服务器端出现错误(此类情况较少见)。"},
    status.HTTP_504_GATEWAY_TIMEOUT: {"description": "服务器端出现错误(此类情况较少见)。"}
}

# 自定义OpenAPI Schema
def custom_openapi():
    if app.openapi_schema:
        return app.openapi_schema
    openapi_schema = get_openapi(
        title="用户管理API",
        version="1.0.0",
        description="用于用户增查的API服务",
        routes=app.routes,
    )
    # 为每个路径的每个方法添加全局通用响应
    for path in openapi_schema["paths"].values():
        for method in path.values():
            method["responses"].update(COMMON_RESPONSES)
    app.openapi_schema = openapi_schema
    return app.openapi_schema

app.openapi = custom_openapi

class User(BaseModel):
    username: str

user_list = ["John", "Abrahim", "Kiana"]

@app.get('/user/{id}/')
def users(id: int):
    if id < 0 or id >= len(user_list):
        raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="请求的资源不存在。")
    return user_list[id]

@app.post('/user')
def add_user(request: User):
    if request.username in user_list:
        raise HTTPException(status_code=status.HTTP_409_CONFLICT, detail="请求与其他请求冲突(可能因使用相同幂等键)。")
    user_list.append(request.username)
    return request.username

if __name__ == "__main__":
    uvicorn.run(app, host="127.0.0.1", port=8000)

效果验证

启动服务后,访问http://127.0.0.1:8000/redoc,即可看到每个接口下已配置的所有响应码及对应的自定义描述。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 19:27:19