【发布时间】:2022-08-19 20:04:52
【问题描述】:
我正在构建一个 FastAPI 应用程序,它有很多 Pydantic 模型。尽管应用程序运行良好,但正如预期的那样,OpenAPI (Swagger UI) 文档并未在 Schemas 部分下显示所有这些模型的架构。
这里是pydanticschemas.py的内容
import socket
from datetime import datetime
from enum import Enum
from typing import Any, Dict, List, Optional, Set, Union
from pydantic import BaseModel, Field, validator
from typing_extensions import Literal
ResponseData = Union[List[Any], Dict[str, Any], BaseModel]
# Not visible in Swagger UI
class PageIn(BaseModel):
page_size: int = Field(default=100, gt=0)
num_pages: int = Field(default=1, gt=0, exclude=True)
start_page: int = Field(default=1, gt=0, exclude=True)
# visible under schemas on Swagger UI
class PageOut(PageIn):
total_records: int = 0
total_pages: int = 0
current_page: int = 1
class Config: # pragma: no cover
@staticmethod
def schema_extra(schema, model) -> None:
schema.get(\"properties\").pop(\"num_pages\")
schema.get(\"properties\").pop(\"start_page\")
# Not visible in Swagger UI
class BaseResponse(BaseModel):
host_: str = Field(default_factory=socket.gethostname)
message: Optional[str]
# Not visible in Swagger UI
class APIResponse(BaseResponse):
count: int = 0
location: Optional[str]
page: Optional[PageOut]
data: ResponseData
# Not visible in Swagger UI
class ErrorResponse(BaseResponse):
error: str
# visible under schemas on Swagger UI
class BaseFaultMap(BaseModel):
detection_system: Optional[str] = Field(\"\", example=\"obhc\")
fault_type: Optional[str] = Field(\"\", example=\"disk\")
team: Optional[str] = Field(\"\", example=\"dctechs\")
description: Optional[str] = Field(
\"\",
example=\"Hardware raid controller disk failure found. \"
\"Operation can continue normally,\"
\"but risk of data loss exist\",
)
# Not visible in Swagger UI
class FaultQueryParams(BaseModel):
f_id: Optional[int] = Field(None, description=\"id for the host\", example=12345, title=\"Fault ID\")
hostname: Optional[str]
status: Literal[\"open\", \"closed\", \"all\"] = Field(\"open\")
created_by: Optional[str]
environment: Optional[str]
team: Optional[str]
fault_type: Optional[str]
detection_system: Optional[str]
inops_filters: Optional[str] = Field(None)
date_filter: Optional[str] = Field(\"\",)
sort_by: Optional[str] = Field(\"created\",)
sort_order: Literal[\"asc\", \"desc\"] = Field(\"desc\")
所有这些模型实际上都在 FastAPI 路径中用于验证请求正文。 FaultQueryParams 是一个自定义模型,我用它来验证请求查询参数,使用如下:
query_args: FaultQueryParams = Depends()
其余模型与Body 字段一起使用。我无法弄清楚为什么在 Schemas 部分中只有一些模型不可见,而其他模型则可见。
关于FaultQueryParams,我注意到的另一件事是描述,示例不会显示在路径端点上,即使它们是在模型中定义的。
编辑1:
我更深入地研究并意识到所有在 swagger UI 中不可见的模型都是没有直接在路径操作中使用的模型,即这些模型没有被用作 response_model 或 Body 类型并且是排序的间接使用的辅助模型。因此,FastAPI 似乎没有为这些模型生成模式。
上述语句的一个例外是query_args: FaultQueryParams = Depends(),它直接在路径操作中用于将端点的Query 参数映射到自定义模型。这是一个问题,因为 swagger 没有从这个模型的字段中识别元参数,如 title、description、example,并且没有显示在 UI 上,这对这个端点的用户很重要。
有没有办法欺骗 FastAPI 为自定义模型 FaultQueryParams 生成架构,就像它为 Body、Query 等生成架构一样?
标签: python swagger openapi fastapi pydantic