Веб-приложение FastAPI
В этой главе вы с нуля создадите своё первое веб-приложение на FastAPI и познакомитесь с автоматически создаваемой документацией API.
Различия в позиционировании FastAPI и Django/Flask
FastAPI — восходящая звезда среди веб-фреймворков Python, занимающая позицию между Django и Flask.
| Особенности | Django | Flask | FastAPI |
|---|---|---|---|
| Философия дизайна | Батарейки в комплекте | Микрофреймворк, расширяемый по необходимости | Высокая производительность, ориентация на типы |
| Поддержка асинхронности | Поддерживается начиная с 3.1+ | Нет встроенной поддержки | Нативная поддержка async/await |
| Документация API | Требуется drf-spectacular | Требуется Flasgger | Автоматическая генерация Swagger UI |
| Валидация данных | Django Forms / DRF Serializer | Flask-WTF / вручную | Pydantic (встроенный) |
| Server | WSGI(Gunicorn) | WSGI(Gunicorn) | ASGI(Uvicorn) |
| Типобезопасность | Optional | Optional | Обязательные аннотации типов 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
Пример
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.
Другие расширения