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

FastAPI中Depends结合Request时Schema未在Swagger显示的修复方法

问题:UserCreateData Schema未在Swagger中显示的修复方案

你当前的代码中,UserCreateData这个Pydantic模型没有在FastAPI的Swagger文档(/docs)中显示,接口参数部分也未生成对应的请求体结构。

原代码

from fastapi import FastAPI, Depends
from pydantic import BaseModel, EmailStr
from starlette.requests import Request

app = FastAPI()


class UserCreateData(BaseModel):
    first_name: str
    last_name: str
    email: EmailStr  # unique
    username: str  # unique


async def validate_user_create_data(request: Request) -> UserCreateData:
    body = await request.body()
    validation_errors = []

    try:
        user_create_data = UserCreateData.parse_raw(body)
    except ValidationError as e:
        pydantic_validation_errors = e.errors()
        validation_errors.extend(pydantic_validation_errors)

    # complex validation with nested models (uniqueness validation, etc)
    # add complex validation errors to validation_errors
    # raise ALL validation errors if validation_errors exist

    return user_create_data


@app.post('/users')
async def create_user(user_create_data: UserCreateData = Depends(validate_user_create_data)):
    ...

问题截图

Swagger文档缺失UserCreateData Schema的截图

问题

请问该如何修复此问题?openapi_extra 是否是唯一的解决方式?


修复方案

openapi_extra不是唯一解决方式,以下是几种可行方案:

方法1:遵循FastAPI依赖设计(推荐)

问题根源是你直接通过Request解析请求体,FastAPI无法自动识别依赖返回的UserCreateData作为请求体Schema。改为让FastAPI自动处理请求体,在依赖中接收模型参数再做自定义验证:

from fastapi import FastAPI, Depends, HTTPException
from pydantic import BaseModel, EmailStr, ValidationError
from starlette.status import HTTP_422_UNPROCESSABLE_ENTITY

app = FastAPI()


class UserCreateData(BaseModel):
    first_name: str
    last_name: str
    email: EmailStr  # unique
    username: str  # unique


async def validate_user_create_data(user_data: UserCreateData) -> UserCreateData:
    validation_errors = []
    
    # 在这里添加复杂验证逻辑,比如检查用户名/邮箱唯一性
    # 示例:
    # if await check_username_exists(user_data.username):
    #     validation_errors.append({"loc": ["username"], "msg": "用户名已存在", "type": "value_error"})
    
    if validation_errors:
        raise HTTPException(
            status_code=HTTP_422_UNPROCESSABLE_ENTITY,
            detail=validation_errors
        )
    
    return user_data


@app.post('/users')
async def create_user(user_create_data: UserCreateData = Depends(validate_user_create_data)):
    return {"user": user_create_data}

这种方式既符合FastAPI的设计规范,又能自动在Swagger中生成UserCreateData的请求体Schema,同时保留自定义验证能力。

方法2:使用openapi_extra手动声明Schema

如果必须直接操作Request对象,可以在路由装饰器中手动指定请求体的OpenAPI定义:

from fastapi import FastAPI, Depends, Request
from pydantic import BaseModel, EmailStr, ValidationError
from starlette.status import HTTP_422_UNPROCESSABLE_ENTITY

app = FastAPI()


class UserCreateData(BaseModel):
    first_name: str
    last_name: str
    email: EmailStr  # unique
    username: str  # unique


async def validate_user_create_data(request: Request) -> UserCreateData:
    body = await request.body()
    validation_errors = []

    try:
        user_create_data = UserCreateData.parse_raw(body)
    except ValidationError as e:
        validation_errors.extend(e.errors())

    # 复杂校验逻辑
    # ...
    
    if validation_errors:
        raise HTTPException(
            status_code=HTTP_422_UNPROCESSABLE_ENTITY,
            detail=validation_errors
        )

    return user_create_data


@app.post(
    '/users',
    openapi_extra={
        "requestBody": {
            "content": {
                "application/json": {
                    "schema": UserCreateData.model_json_schema()
                }
            },
            "required": True
        }
    }
)
async def create_user(user_create_data: UserCreateData = Depends(validate_user_create_data)):
    ...

这种方式需要手动维护OpenAPI定义,适合特殊场景下使用。


内容的提问来源于stack exchange,提问作者Альберт Александров

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 10:42:40