Гайды
Документация API: Swagger, ReDoc и OpenAPI в FastAPI
Метаданные приложения, теги и summary, Field examples, responses, скрытие docs в проде, кастомный OpenAPI.
~10 мин чтения
Документация API: Swagger, ReDoc и OpenAPI в FastAPI
FastAPI генерирует OpenAPI 3 схему из типов аннотаций и Field. Swagger UI и ReDoc подключаются из коробки. Этот гайд — как сделать документацию читаемой и точной. База — Быстрый старт с FastAPI.
1. Метаданные приложения
app = FastAPI(
title="Orders API",
description="Внутренний API заказов. Подробнее: [wiki](https://...)",
version="1.2.0",
terms_of_service="https://example.com/terms",
contact={"name": "Platform", "email": "api@example.com"},
license_info={"name": "Proprietary"},
openapi_tags=[
{"name": "orders", "description": "Создание и чтение заказов"},
{"name": "admin", "description": "Только для роли admin"},
],
)
2. Теги и summary на эндпоинтах
@app.post(
"/orders",
response_model=OrderRead,
status_code=201,
tags=["orders"],
summary="Создать заказ",
response_description="Созданный заказ с id",
)
def create_order(payload: OrderCreate):
...
3. Field для JSON Schema
class OrderCreate(BaseModel):
customer_id: int = Field(..., description="ID клиента в CRM", examples=[1001])
lines: list[Line] = Field(..., min_length=1)
examples попадают в OpenAPI и подсказывают в Swagger.
4. Ответы и ошибки в схеме
@app.get(
"/orders/{order_id}",
responses={
200: {"description": "OK"},
404: {"description": "Заказ не найден", "model": ProblemDetail},
},
)
def get_order(order_id: int):
...
Единый формат ошибок (RFC 7807 problem+json) улучшает DX.
5. Скрыть или переименовать доку в проде
app = FastAPI(docs_url=None, redoc_url=None, openapi_url=None)
Или отдавать /docs только при DEBUG через условное создание приложения / reverse proxy ACL.
6. Кастомный OpenAPI
from fastapi.openapi.utils import get_openapi
def custom_openapi():
if app.openapi_schema:
return app.openapi_schema
schema = get_openapi(
title=app.title,
version=app.version,
routes=app.routes,
description=app.description,
)
schema["info"]["x-logo"] = {"url": "https://..."}
app.openapi_schema = schema
return app.openapi_schema
app.openapi = custom_openapi
Полезно для security schemes (OAuth2 flows), общих components.
В schema["servers"] можно перечислить url для dev/stage/prod — Swagger UI подставит выбранный base URL; удобно для QA без ручного редактирования хоста в «Try it out».
7. Swagger UI параметры
from fastapi.openapi.docs import get_swagger_ui_html
@app.get("/docs", include_in_schema=False)
async def swagger_ui():
return get_swagger_ui_html(
openapi_url="/openapi.json",
title="API",
swagger_js_url="https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js",
swagger_css_url="https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css",
swagger_ui_parameters={"persistAuthorization": True},
)
persistAuthorization — удобно для JWT в браузере; см. JWT и OAuth2.
8. Генерация клиентов
Из openapi.json: OpenAPI Generator, orval (TypeScript), datamodel-codegen (Python models). В CI проверяйте, что схема не ломается без мажорного bump версии API. Спецификация OpenAPI: spec.openapis.org.
Снимок схемы в артефакте CI (curl "$BASE/openapi.json" -o openapi.json) позволяет диффать контракт между PR и ловить случайные переименования полей до деплоя.
Связанные материалы
Дальше: тег Swagger · тег FastAPI