FastAPI — один из самых популярных фреймворков для создания API на Python. Его ключевые возможности: высокая производительность, автоматическая валидация через Pydantic и поддержка асинхронности. В этой статье мы собрали 10 промтов (шаблонных запросов), которые помогут вам быстрее и качественнее разрабатывать эндпоинты, настраивать модели данных и обрабатывать фоновые задачи. Каждый промт сопровождается примером кода и пояснением.
1. Базовый эндпоинт с GET-запросом
Самый простой промт для создания эндпоинта, который возвращает JSON-ответ.
Промт:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"message": "Hello, World!"}
Пример результата:
При обращении к GET / клиент получит {"message": "Hello, World!"}. Этот промт — основа для любого API.
2. Эндпоинт с параметрами пути и query-параметрами
FastAPI позволяет легко извлекать параметры из URL.
Промт:
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}
Пример результата:
Запрос GET /items/42?q=test вернёт {"item_id": 42, "q": "test"}. Параметр item_id автоматически преобразуется в int, а q — опциональная строка.
3. POST-эндпоинт с телом запроса через Pydantic
Pydantic — библиотека для валидации данных на основе аннотаций типов. В FastAPI она используется по умолчанию.
Промт:
from pydantic import BaseModel
class Item(BaseModel):
name: str
price: float
is_offer: bool = False
@app.post("/items/")
def create_item(item: Item):
return {"item_name": item.name, "item_price": item.price}
Пример результата:
Отправка POST на /items/ с JSON {"name": "Laptop", "price": 999.99} вернёт {"item_name": "Laptop", "item_price": 999.99}. Если поле price будет строкой, FastAPI вернёт ошибку валидации.
4. Валидация с использованием Field и констрейнтов
Для более точной валидации используйте Field из Pydantic.
Промт:
from pydantic import Field
class Product(BaseModel):
name: str = Field(..., min_length=3, max_length=50)
price: float = Field(..., gt=0, le=10000)
@app.post("/products/")
def create_product(product: Product):
return product
Пример результата:
При попытке отправить {"name": "AB", "price": -5} вернётся ошибка 422 с описанием: name должен быть длиннее 3 символов, price — больше 0.
5. Асинхронный эндпоинт для длительных операций
Используйте async def для неблокирующих операций, например, обращения к внешнему API.
Промт:
import httpx
@app.get("/external-data")
async def get_external_data():
async with httpx.AsyncClient() as client:
response = await client.get("https://api.example.com/data")
return response.json()
Пример результата:
Эндпоинт асинхронно запрашивает данные с внешнего сервиса и возвращает их. Это повышает пропускную способность сервера при большом количестве запросов.
6. Фоновая задача с BackgroundTasks
FastAPI предоставляет встроенный механизм для выполнения задач после отправки ответа клиенту.
Промт:
from fastapi import BackgroundTasks
def write_log(message: str):
with open("log.txt", "a") as f:
f.write(message + "\n")
@app.post("/send-notification")
async def send_notification(email: str, background_tasks: BackgroundTasks):
background_tasks.add_task(write_log, f"Notification sent to {email}")
return {"message": "Notification will be sent"}
Пример результата:
Клиент сразу получает ответ, а запись в лог выполняется в фоне. Это идеально для операций, не требующих немедленного подтверждения.
7. Фоновая задача с Celery для сложных процессов
Для более тяжёлых задач (отправка email, обработка изображений) используйте Celery.
Промт (конфигурация):
from celery import Celery
celery_app = Celery("tasks", broker="redis://localhost:6379/0")
@celery_app.task
def send_email_async(to: str, subject: str, body: str):
# код отправки email
pass
@app.post("/send-email")
def send_email_endpoint(to: str):
send_email_async.delay(to, "Welcome", "Hello!")
return {"status": "queued"}
Пример результата:
Запрос на /send-email ставит задачу в очередь Redis, и Celery worker выполняет её асинхронно.
8. Эндпоинт с зависимостями (Dependency Injection)
FastAPI поддерживает внедрение зависимостей, что упрощает повторное использование кода.
Промт:
from fastapi import Depends
def common_parameters(q: str = None, skip: int = 0, limit: int = 100):
return {"q": q, "skip": skip, "limit": limit}
@app.get("/items/")
def read_items(commons: dict = Depends(common_parameters)):
return commons
Пример результата:
Запрос GET /items/?q=test&skip=10&limit=50 вернёт {"q": "test", "skip": 10, "limit": 50}. Зависимость автоматически извлекает query-параметры.
9. Обработка ошибок с кастомными исключениями
Создайте собственное исключение и обработчик для него.
Промт:
from fastapi import HTTPException
class ItemNotFoundException(Exception):
pass
@app.exception_handler(ItemNotFoundException)
async def item_not_found_handler(request, exc):
return JSONResponse(status_code=404, content={"error": "Item not found"})
@app.get("/items/{item_id}")
def get_item(item_id: int):
if item_id != 1:
raise ItemNotFoundException()
return {"item_id": item_id}
Пример результата:
При запросе несуществующего item_id возвращается 404 с кастомным сообщением.
10. Документация и метаданные API
FastAPI автоматически генерирует документацию OpenAPI и Swagger UI.
Промт:
app = FastAPI(title="My API", description="API for managing items", version="1.0.0")
@app.get("/", summary="Root endpoint", tags=["Root"])
async def root():
return {"message": "Hello"}
Пример результата:
По адресу /docs будет доступен Swagger UI с описанием всех эндпоинтов, включая параметры и модели Pydantic.
Заключение
Мы рассмотрели 10 промтов, которые покрывают базовые и продвинутые возможности FastAPI: от простых GET-запросов до фоновых задач с Celery и кастомных исключений. Используйте эти шаблоны как отправную точку для своих проектов. FastAPI активно развивается, и его документация (fastapi.tiangolo.com) является лучшим источником для углублённого изучения. Экспериментируйте, комбинируйте промты и создавайте надёжные API.
Комментарии