Розширення OpenAPI¶
🌐 Переклад ШІ та людьми
Цей переклад виконано ШІ під керівництвом людей. 🤝
Можливі помилки через неправильне розуміння початкового змісту або неприродні формулювання тощо. 🤖
Ви можете покращити цей переклад, допомігши нам краще спрямовувати AI LLM.
У деяких випадках вам може знадобитися змінити згенеровану схему OpenAPI.
У цьому розділі ви побачите як це зробити.
Звичайний процес¶
Звичайний (типовий) процес такий.
Застосунок FastAPI (екземпляр) має метод .openapi(), який має повертати схему OpenAPI.
Під час створення об'єкта застосунку реєструється операція шляху для /openapi.json (або для того значення, яке ви встановили в openapi_url).
Вона просто повертає відповідь JSON з результатом методу .openapi() застосунку.
Типово метод .openapi() перевіряє властивість .openapi_schema, і якщо там вже є дані, повертає їх.
Якщо ні, він генерує їх за допомогою утилітарної функції fastapi.openapi.utils.get_openapi.
Функція get_openapi() приймає такі параметри:
title: Заголовок OpenAPI, показується в документації.version: Версія вашого API, напр.2.5.0.openapi_version: Версія специфікації OpenAPI, що використовується. Типово остання:3.1.0.summary: Короткий підсумок API.description: Опис вашого API; може містити markdown і буде показаний у документації.routes: Список маршрутів, це кожна з зареєстрованих операцій шляху. Їх беруть зapp.routes.
Інформація
Параметр summary доступний в OpenAPI 3.1.0 і вище, підтримується FastAPI 0.99.0 і вище.
Переписування типових значень¶
Використовуючи наведене вище, ви можете скористатися тією ж утилітарною функцією для генерації схеми OpenAPI і переписати потрібні частини.
Наприклад, додаймо розширення OpenAPI для ReDoc для додавання власного логотипа.
Звичайний FastAPI¶
Спочатку напишіть ваш застосунок FastAPI як зазвичай:
from fastapi import FastAPI
from fastapi.openapi.utils import get_openapi
app = FastAPI()
@app.get("/items/")
async def read_items():
return [{"name": "Foo"}]
def custom_openapi():
if app.openapi_schema:
return app.openapi_schema
openapi_schema = get_openapi(
title="Custom title",
version="2.5.0",
summary="This is a very custom OpenAPI schema",
description="Here's a longer description of the custom **OpenAPI** schema",
routes=app.routes,
)
openapi_schema["info"]["x-logo"] = {
"url": "https://fastapi.tiangolo.com/img/logo-margin/logo-teal.png"
}
app.openapi_schema = openapi_schema
return app.openapi_schema
app.openapi = custom_openapi
Згенерувати схему OpenAPI¶
Далі використайте ту ж утилітарну функцію для генерації схеми OpenAPI всередині функції custom_openapi():
from fastapi import FastAPI
from fastapi.openapi.utils import get_openapi
app = FastAPI()
@app.get("/items/")
async def read_items():
return [{"name": "Foo"}]
def custom_openapi():
if app.openapi_schema:
return app.openapi_schema
openapi_schema = get_openapi(
title="Custom title",
version="2.5.0",
summary="This is a very custom OpenAPI schema",
description="Here's a longer description of the custom **OpenAPI** schema",
routes=app.routes,
)
openapi_schema["info"]["x-logo"] = {
"url": "https://fastapi.tiangolo.com/img/logo-margin/logo-teal.png"
}
app.openapi_schema = openapi_schema
return app.openapi_schema
app.openapi = custom_openapi
Змінити схему OpenAPI¶
Тепер можна додати розширення ReDoc, додавши власний x-logo до «об'єкта» info у схемі OpenAPI:
from fastapi import FastAPI
from fastapi.openapi.utils import get_openapi
app = FastAPI()
@app.get("/items/")
async def read_items():
return [{"name": "Foo"}]
def custom_openapi():
if app.openapi_schema:
return app.openapi_schema
openapi_schema = get_openapi(
title="Custom title",
version="2.5.0",
summary="This is a very custom OpenAPI schema",
description="Here's a longer description of the custom **OpenAPI** schema",
routes=app.routes,
)
openapi_schema["info"]["x-logo"] = {
"url": "https://fastapi.tiangolo.com/img/logo-margin/logo-teal.png"
}
app.openapi_schema = openapi_schema
return app.openapi_schema
app.openapi = custom_openapi
Кешувати схему OpenAPI¶
Ви можете використовувати властивість .openapi_schema як «кеш» для збереження згенерованої схеми.
Так вашому застосунку не доведеться щоразу генерувати схему, коли користувач відкриває документацію вашого API.
Вона буде згенерована лише один раз, а потім та сама закешована схема використовуватиметься для наступних запитів.
from fastapi import FastAPI
from fastapi.openapi.utils import get_openapi
app = FastAPI()
@app.get("/items/")
async def read_items():
return [{"name": "Foo"}]
def custom_openapi():
if app.openapi_schema:
return app.openapi_schema
openapi_schema = get_openapi(
title="Custom title",
version="2.5.0",
summary="This is a very custom OpenAPI schema",
description="Here's a longer description of the custom **OpenAPI** schema",
routes=app.routes,
)
openapi_schema["info"]["x-logo"] = {
"url": "https://fastapi.tiangolo.com/img/logo-margin/logo-teal.png"
}
app.openapi_schema = openapi_schema
return app.openapi_schema
app.openapi = custom_openapi
Переписати метод¶
Тепер ви можете замінити метод .openapi() вашою новою функцією.
from fastapi import FastAPI
from fastapi.openapi.utils import get_openapi
app = FastAPI()
@app.get("/items/")
async def read_items():
return [{"name": "Foo"}]
def custom_openapi():
if app.openapi_schema:
return app.openapi_schema
openapi_schema = get_openapi(
title="Custom title",
version="2.5.0",
summary="This is a very custom OpenAPI schema",
description="Here's a longer description of the custom **OpenAPI** schema",
routes=app.routes,
)
openapi_schema["info"]["x-logo"] = {
"url": "https://fastapi.tiangolo.com/img/logo-margin/logo-teal.png"
}
app.openapi_schema = openapi_schema
return app.openapi_schema
app.openapi = custom_openapi
Перевірте¶
Коли ви перейдете за адресою http://127.0.0.1:8000/redoc, побачите, що використовується ваш власний логотип (у цьому прикладі логотип FastAPI):
