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)): ...
问题截图

问题
请问该如何修复此问题?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,提问作者Альберт Александров
相关产品推荐
相关产品推荐

