Практические задания к GUIDE.md. Делай их руками в main.py, запускай приложение и проверяй результат в /docs.
- Прочитай тему в
GUIDE.md. - Напиши код сам, не копируя бездумно.
- Запусти приложение:
uv run fastapi dev- Открой
http://127.0.0.1:8000/docs. - Проверь endpoint вручную.
- Запусти тесты:
uv run pytest- Если что-то сломалось, прочитай ошибку и найди место проблемы.
Цель: понять FastAPI(), декораторы и обычные GET endpoints.
Проверь текущий endpoint:
GET /
Ожидаемый ответ:
{
"message": "Hello from FastAPI Cloud"
}Самопроверка:
- endpoint виден в
/docs; - тег называется
root; - тест
test_homeпроходит.
Проверь endpoint:
GET /health
Ожидаемый ответ:
{
"status": "ok"
}Вопросы:
- зачем backend-приложению healthcheck?
- почему этот endpoint должен быть простым?
- какой status code должен быть при успехе?
Цель: понять разницу между path-параметром и query-параметром.
Проверь endpoint:
GET /items/5
Ожидаемый ответ:
{
"item_id": 5,
"q": null
}Теперь проверь:
GET /items/5?q=somequery
Ожидаемый ответ:
{
"item_id": 5,
"q": "somequery"
}Вопросы:
- откуда FastAPI берет
item_id? - откуда FastAPI берет
q? - почему
qможет бытьnull?
Открой:
GET /items/not-an-int
Ожидаемый status code:
422
Найди в ответе:
detail;loc;msg;input.
Объясни своими словами, почему FastAPI вернул 422.
Цель: научиться добавлять простые маршруты самостоятельно.
Добавь endpoint:
GET /version
Ожидаемый ответ:
{
"version": "0.1.0"
}Требования:
- добавь
tags=["meta"]; - добавь
summary; - добавь тест.
Добавь endpoint:
GET /hello/{name}
Пример:
GET /hello/Anna
Ожидаемый ответ:
{
"message": "Hello, Anna"
}Дополнительно:
- добавь query-параметр
uppercase: bool = False; - если
uppercase=true, возвращай сообщение большими буквами.
Цель: научиться принимать JSON body.
Создай Pydantic-модели:
from pydantic import BaseModel, Field
class BookCreate(BaseModel):
title: str = Field(min_length=1, max_length=120)
author: str = Field(min_length=1, max_length=80)
class BookRead(BookCreate):
id: intДобавь:
POST /books
GET /books
GET /books/{book_id}
Требования:
POST /booksвозвращает201;GET /books/{book_id}возвращает404, если книги нет;- данные можно хранить в словаре в памяти;
- все endpoints имеют
tags=["books"].
Цель: понять PATCH, DELETE, exclude_unset=True.
Добавь модель:
class BookUpdate(BaseModel):
title: str | None = Field(default=None, min_length=1, max_length=120)
author: str | None = Field(default=None, min_length=1, max_length=80)Добавь:
PATCH /books/{book_id}
DELETE /books/{book_id}
Требования:
PATCHобновляет только переданные поля;DELETEвозвращает204;- если книги нет, вернуть
404; - добавь тесты.
Цель: подготовиться к структуре большого приложения.
Создай структуру:
app/
├── __init__.py
├── main.py
└── routers/
├── __init__.py
└── books.py
Перенеси books endpoints в app/routers/books.py.
Требования:
- используй
APIRouter; - подключи router через
include_router; - обнови
entrypointвpyproject.toml, если переносишь приложение изmain.pyвapp/main.py; - тесты должны проходить.
После выполнения заданий ты должен уметь:
- объяснить
app = FastAPI(...); - объяснить
@app.get; - отличать path от query;
- читать ошибку
422; - создавать Pydantic-модели;
- использовать
response_model; - возвращать
404черезHTTPException; - писать простые тесты;
- понимать, зачем нужен
APIRouter.