FastAPI — это современная высокопроизводительная веб-платформа для создания API с помощью Python. Он предлагает широкий спектр функций и преимуществ, включая автоматическое создание документации API с использованием схемы JSON. Однако в некоторых сценариях вам может потребоваться скрыть информацию о схеме конечных точек API, чтобы повысить безопасность и предотвратить потенциальную утечку информации. В этой статье мы рассмотрим несколько методов эффективного сокрытия схемы в FastAPI, сохраняя при этом функциональность вашего API.
Метод 1: модели индивидуального ответа
Один из способов скрыть детали схемы — использовать пользовательские модели ответов. Определив свои собственные модели ответов, вы можете указать только необходимые поля, опуская те, которые хотите скрыть. Давайте рассмотрим пример:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
price: float
class HiddenItem(BaseModel):
name: str
@app.get("/items/{item_id}", response_model=HiddenItem)
async def read_item(item_id: int):
# Fetch item details from the database
item = fetch_item_from_db(item_id)
return HiddenItem(name=item.name)
В приведенном выше фрагменте кода мы определяем две модели Pydantic: Item
и HiddenItem
. Модель HiddenItem
содержит только те поля, которые мы хотим предоставить, в данном случае поле name
. Указав response_model=HiddenItem
для конечной точки API, FastAPI автоматически сгенерирует документацию со скрытой схемой.
Метод 2: Response_model_exclude_unset
Другой подход — использовать параметр response_model_exclude_unset
, который позволяет исключить любые поля, имеющие значения по умолчанию. Вот пример:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
price: float
@app.get("/items/{item_id}", response_model=Item, response_model_exclude_unset=True)
async def read_item(item_id: int):
# Fetch item details from the database
item = fetch_item_from_db(item_id)
return item
В этом примере параметр response_model_exclude_unset=True
исключает из документации API любые поля, имеющие значения по умолчанию. Это эффективно скрывает детали схемы для этих полей.
Метод 3. Пользовательский ответ в формате JSON
Если вам нужен больший контроль над форматом ответа, вы можете возвращать ответы JSON напрямую, не полагаясь на автоматическое создание схемы. Вот пример:
from fastapi import FastAPI
from fastapi.responses import JSONResponse
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id: int):
# Fetch item details from the database
item = fetch_item_from_db(item_id)
response_data = {"name": item.name}
return JSONResponse(content=response_data)
Создавая ответ вручную и возвращая его в виде ответа JSON с помощью JSONResponse
, вы получаете полный контроль над предоставляемыми данными. Это позволяет скрыть из схемы любую конфиденциальную или ненужную информацию.
В этой статье мы рассмотрели три метода, позволяющие скрыть схему в FastAPI и повысить безопасность конечных точек вашего API. Используя настраиваемые модели ответов, исключая неустановленные поля или создавая собственные ответы JSON, вы можете контролировать уровень информации, предоставляемой в документации API. Не забудьте внимательно оценить свои требования к безопасности и выбрать метод, который лучше всего соответствует вашим потребностям.