Веб-приложение FastAPI

В этой главе вы с нуля создадите своё первое веб-приложение на FastAPI и познакомитесь с автоматически создаваемой документацией API.


Различия в позиционировании FastAPI и Django/Flask

FastAPI — восходящая звезда среди веб-фреймворков Python, занимающая позицию между Django и Flask.

ОсобенностиDjangoFlaskFastAPI
Философия дизайнаБатарейки в комплектеМикрофреймворк, расширяемый по необходимостиВысокая производительность, ориентация на типы
Поддержка асинхронностиПоддерживается начиная с 3.1+Нет встроенной поддержкиНативная поддержка async/await
Документация APIТребуется drf-spectacularТребуется FlasggerАвтоматическая генерация Swagger UI
Валидация данныхDjango Forms / DRF SerializerFlask-WTF / вручнуюPydantic (встроенный)
ServerWSGI(Gunicorn)WSGI(Gunicorn)ASGI(Uvicorn)
ТипобезопасностьOptionalOptionalОбязательные аннотации типов Python

Главное отличие FastAPI:Управляйте всем с помощью аннотаций типов Python— автоматическая валидация параметров маршрута, автоматическая сериализация запросов/ответов и автоматическая генерация интерактивной документации.


Подготовка окружения

$ python3 -m venv venv
$ source venv/bin/activate
(venv) $ pip install fastapi uvicorn jinja2 python-multipart

Объяснение трёх основных зависимостей:

  • fastapi: Сам веб-фреймворк
  • uvicorn: ASGI-сервер (аналог Gunicorn для Flask)
  • jinja2: Движок шаблонов (необязателен, но необходим для SSR)

Минимальное приложение FastAPI

Пример

# Путь к файлу: main.py
from fastapi import FastAPI

# Создание экземпляра FastAPI
app = FastAPI(
    title="ПРИМЕР блога",
    description="Демонстрационный сайт личного блога, созданный с помощью FastAPI",
    version="1.0.0"
)

@app.get("/")           # Декоратор маршрута для GET-запроса
def index():
    """Главная страница"""
    return {"message": "Добро пожаловать в блог EXAMPLE"}

@app.get("/hello/{name}")   # Параметр пути {name}
def hello(name: str):       # FastAPI автоматически валидирует на основе аннотаций типов
    return {"greeting": f"Привет, {name}!"}

Запуск сервера

(venv) $ uvicorn main:app --reload
INFO:     Uvicorn running on http://127.0.0.1:8000

Обратите внимание, что метод запуска отличается от Flask:

  • Flask:flask run(на основе Werkzeug)
  • FastAPI:uvicorn main:app(Основан на ASGI, нативно поддерживает async)

Автоматически сгенерированная документация API

Это самая потрясающая возможность FastAPI —автоматически генерировать интерактивную документацию без написания какого-либо дополнительного кода。

Посетить/docsВы увидите Swagger UI, где можно тестировать API прямо на странице:

http://127.0.0.1:8000/docs      # Swagger UI(交互式测试)
http://127.0.0.1:8000/redoc     # ReDoc(只读文档,更美观)

В Swagger UI: Нажмите GET /hello/{name} → Try it out → Введите name → Execute, и вы увидите реальный ответ.


Планирование структуры каталогов проекта

blog_project/
├── main.py               # 应用入口
├── models.py             # SQLAlchemy ORM 模型
├── schemas.py            # Pydantic Schema(FastAPI 独有)
├── database.py           # 数据库连接与 Session
├── auth.py               # JWT 认证逻辑
├── routers/              # APIRouter 路由模块
│   ├── posts.py
│   ├── categories.py
│   ├── users.py
│   └── favorites.py
├── templates/            # Jinja2 模板
├── static/               # 静态文件
└── alembic/              # 数据库迁移

Flask использует Blueprint для организации маршрутов, FastAPI используетAPIRouter. Концепция похожа, но синтаксис отличается, и APIRouter нативно поддерживает ограничения типов.


Итоги главы

В этой главе вы сделали три вещи: установили FastAPI + Uvicorn, написали свой первый маршрут с подсказками типов и посетили автоматически сгенерированную интерактивную документацию API /docs.

Ключевой вывод: FastAPI использует подсказки типов Python для управления валидацией параметров и генерацией документации. Это его самая фундаментальная особенность, отличающая его от Django/Flask.

Другие расширения