Введение
FastAPI — это современный веб-фреймворк для Python, который за последние годы стал стандартом для создания высокопроизводительных API. Его главные фишки: автоматическая валидация данных через Pydantic, асинхронность из коробки и интерактивная документация. Однако даже опытные разработчики иногда тратят часы на написание однотипных эндпоинтов или настройку фоновых задач. В этой статье — 10 готовых промтов (подсказок-шаблонов), которые ускорят разработку и помогут избежать типовых ошибок. Каждый промт сопровождается пояснением и примером использования.
1. Базовый эндпоинт с GET-запросом
Для чего: Быстро создать простой эндпоинт, который возвращает данные.
Промт:
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
def read_item(item_id: int):
return {"item_id": item_id, "name": f"Item {item_id}"}
Пример использования:
Запрос GET /items/42 вернёт {"item_id": 42, "name": "Item 42"}. Важно: FastAPI автоматически проверяет, что item_id — целое число, иначе вернёт ошибку 422.
2. Эндпоинт с POST и Pydantic-моделью
Для чего: Валидировать входящие JSON-данные с помощью Pydantic.
Промт:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
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/ с телом {"name": "Laptop", "price": 999.99} вернёт {"item_name": "Laptop", "item_price": 999.99}. Если пропустить обязательное поле name, FastAPI вернёт 422 с описанием ошибки.
3. Асинхронный эндпоинт с await
Для чего: Выполнять I/O-bound операции (запросы к БД, внешним API) без блокировки.
Промт:
from fastapi import FastAPI
import httpx
app = FastAPI()
@app.get("/async-data")
async def get_async_data():
async with httpx.AsyncClient() as client:
response = await client.get("https://api.example.com/data")
return response.json()
Пример использования:
При запросе GET /async-data сервер не блокирует другие запросы во время ожидания ответа от внешнего API. Это критично для высоконагруженных приложений.
4. Эндпоинт с параметрами запроса (query parameters)
Для чего: Передавать фильтры, пагинацию и другие опциональные параметры.
Промт:
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/")
def list_items(skip: int = 0, limit: int = 10):
fake_items = [{"id": i} for i in range(100)]
return fake_items[skip:skip + limit]
Пример использования:
Запрос GET /items/?skip=20&limit=5 вернёт элементы с 20 по 24. Параметры со значениями по умолчанию опциональны.
5. Фоновая задача с BackgroundTasks
Для чего: Запускать длительные операции (отправка email, обработка файлов) после ответа клиенту.
Промт:
from fastapi import FastAPI, BackgroundTasks
app = FastAPI()
def write_log(message: str):
with open("log.txt", "a") as f:
f.write(f"{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 queued"}
Пример использования:
Клиент получает мгновенный ответ, а запись в лог выполняется асинхронно. Важно: BackgroundTasks подходит для лёгких задач; для тяжёлых используйте Celery или RQ.
6. Валидация строк с помощью Pydantic
Для чего: Проверять формат email, URL, длину строки.
Промт:
from pydantic import BaseModel, EmailStr, Field
class User(BaseModel):
username: str = Field(..., min_length=3, max_length=20)
email: EmailStr
@app.post("/users/")
def create_user(user: User):
return user
Пример использования:
Запрос с username: "A" вернёт ошибку, так как длина меньше 3. EmailStr требует установки pydantic[email].
7. Эндпоинт с зависимостями (Dependency Injection)
Для чего: Повторно использовать логику (проверка токена, подключение к БД).
Промт:
from fastapi import FastAPI, Depends, HTTPException
app = FastAPI()
def verify_token(token: str):
if token != "secret":
raise HTTPException(status_code=401, detail="Invalid token")
return token
@app.get("/protected")
def protected_route(token: str = Depends(verify_token)):
return {"message": "Access granted", "token": token}
Пример использования:
Запрос GET /protected?token=secret вернёт успех; иначе — 401. Зависимости можно вкладывать и переиспользовать.
8. Обработка ошибок с кастомным HTTPException
Для чего: Возвращать понятные сообщения об ошибках.
Промт:
from fastapi import FastAPI, HTTPException
app = FastAPI()
items = {1: "Laptop", 2: "Phone"}
@app.get("/items/{item_id}")
def read_item(item_id: int):
if item_id not in items:
raise HTTPException(status_code=404, detail="Item not found")
return {"item": items[item_id]}
Пример использования:
Запрос GET /items/3 вернёт 404 с JSON {"detail": "Item not found"}.
9. Эндпоинт с загрузкой файла
Для чего: Принимать файлы от клиента (изображения, документы).
Промт:
from fastapi import FastAPI, File, UploadFile
app = FastAPI()
@app.post("/upload/")
async def upload_file(file: UploadFile = File(...)):
content = await file.read()
return {"filename": file.filename, "size": len(content)}
Пример использования:
Клиент отправляет файл через форму, сервер возвращает имя и размер. Для больших файлов используйте фоновые задачи.
10. Фоновая задача с Celery (расширенный вариант)
Для чего: Выполнять тяжёлые задачи (генерация отчётов, отправка писем) в отдельном воркере.
Промт:
from celery import Celery
from fastapi import FastAPI
celery_app = Celery("tasks", broker="redis://localhost:6379/0")
@celery_app.task
def send_email_task(email: str):
# Имитация отправки
return f"Email sent to {email}"
app = FastAPI()
@app.post("/send-email")
def send_email(email: str):
task = send_email_task.delay(email)
return {"task_id": task.id, "status": "queued"}
Пример использования:
Запрос возвращает ID задачи, а фактическая отправка выполняется в фоне. Celery требует запущенного Redis и воркера.
Заключение
Эти 10 промтов покрывают 90% повседневных задач в FastAPI: от простых GET-эндпоинтов до фоновой обработки с Celery. Используйте их как стартовую точку — адаптируйте под свои проекты, добавляйте логирование и тесты. FastAPI продолжает активно развиваться, и его экосистема (Pydantic v2, Starlette) делает разработку безопасной и быстрой. Если вам нужно интегрировать FastAPI с внешними сервисами (например, Telegram, Stripe, любые REST API), ASI Biont поддерживает подключение к ним через готовые коннекторы — подробнее на asibiont.com/courses. Начните с малого — и вы увидите, как промты экономят часы кодинга.
Комментарии