Вот содержимое pydantic Schemas.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")
Код: Выделить всё
query_args: FaultQueryParams = Depends()
Еще одна вещь, которую я заметил в FaultQueryParams заключается в том, что в описании примеры не отображаются рядом с конечной точкой пути, даже если они определены в модели.
Изменить 1:
Я внимательно изучил и понял, что все модели, которых нет видимыми в пользовательском интерфейсе Swagger являются те, которые не используются непосредственно в операциях пути, т. е. эти модели не используются как типы response_model или Body и являются своего рода вспомогательными моделями, которые используются косвенно. Итак, похоже, что FastAPI не генерирует схему для этих моделей.
Единственным исключением из приведенного выше утверждения является query_args: FaultQueryParams = Depends(), который используется непосредственно в операция пути для сопоставления параметров запроса для конечной точки с пользовательской моделью. Это проблема, поскольку Swagger не идентифицирует метапараметры, такие как заголовок, описание, пример, из полей этой модели и не отображается в пользовательском интерфейсе, что важно для пользователей этой модели. конечная точка.
Есть ли способ заставить FastAPI генерировать схему для пользовательской модели FaultQueryParams так же, как она генерирует для Body, Query и т. д.?
Подробнее здесь: https://stackoverflow.com/questions/719 ... astapi-app