Фреймворки Python для веб-разработки: обзор и выбор
Обзор веб-фреймворков Python: Django, Flask, FastAPI, Litestar и Starlette — примеры кода, таблица сравнения и как выбрать фреймворк под задачу.
Содержание · 10 разделов
- Что такое веб-фреймворк и зачем он нужен
- WSGI и ASGI: синхронные и асинхронные фреймворки
- Django: всё включено
- Flask: микрофреймворк
- FastAPI: API на аннотациях типов
- Litestar и Starlette: кратко
- Starlette
- Litestar
- Другие фреймворки
- Сравнение фреймворков Python
- Как выбрать фреймворк Python под задачу
- Как запускать приложение в продакшне
- Частые вопросы
- Какой фреймворк Python учить первым?
- Можно ли сделать сайт с HTML-страницами на FastAPI?
- Django медленный?
- Можно ли совмещать фреймворки?
- Чем фреймворк отличается от библиотеки?
- Итог
Фреймворки Python для веб-разработки решают одну задачу — принимают HTTP-запрос и помогают сформировать ответ, — но делают это с разной степенью «готовности». Django даёт всё сразу: ORM, админку, авторизацию, формы. Flask — минимальное ядро, к которому вы сами подбираете компоненты. FastAPI заточен под API: валидация данных и документация OpenAPI генерируются из аннотаций типов.
Короткий ответ на вопрос «что выбрать»: Django — для сайтов и сервисов с базой данных, пользователями и панелью администратора; FastAPI — для JSON API и микросервисов; Flask — для небольших приложений, прототипов и обучения, когда нужна свобода в выборе инструментов. Ниже — как устроен каждый фреймворк, примеры кода, таблица сравнения и сценарии выбора.
Что такое веб-фреймворк и зачем он нужен
Без фреймворка веб-приложению пришлось бы самому разбирать HTTP-запросы, сопоставлять URL с кодом, экранировать HTML, работать с cookie и сессиями. Фреймворк берёт это на себя и даёт типовые компоненты:
- маршрутизация — какой функции отдать запрос на
/books/42/; - обработка запроса и ответа — параметры, формы, JSON, заголовки, статусы;
- шаблоны — генерация HTML с подстановкой данных;
- работа с базой данных — ORM или интеграция со сторонней;
- безопасность — защита от CSRF и XSS, хеширование паролей;
- расширяемость — middleware, плагины, зависимости.
Фреймворки различаются тем, какие из этих компонентов встроены, а какие подключаются отдельно. Отсюда деление на full-stack (всё в комплекте, как Django) и микрофреймворки (минимальное ядро, как Flask).
WSGI и ASGI: синхронные и асинхронные фреймворки
Python-приложение не принимает соединения из интернета само — его запускает сервер приложений по стандартному интерфейсу:
- WSGI — синхронный стандарт: один запрос занимает процесс или поток до конца обработки. Серверы: Gunicorn, uWSGI, Waitress.
- ASGI — асинхронный преемник WSGI: поддерживает
async/await, WebSocket и долгие соединения. Серверы: Uvicorn, Hypercorn, Daphne.
Flask — WSGI-фреймворк, FastAPI, Starlette и Litestar — ASGI, а Django поддерживает оба интерфейса. Асинхронность помогает, когда приложение много ждёт: сетевых запросов к другим сервисам, WebSocket-соединений. Для типичного сайта, который ходит в базу данных и рендерит страницы, синхронного кода обычно достаточно.
Django: всё включено
Django — самый крупный и старый из популярных фреймворков (первый публичный релиз — 2005 год). Принцип «батарейки в комплекте» означает, что основная функциональность сайта уже встроена:
- ORM с миграциями и поддержкой PostgreSQL, MySQL, SQLite, Oracle;
- автоматическая админка Django для управления данными;
- пользователи, группы, права доступа, вход и сброс пароля;
- формы с валидацией, шаблоны, кеширование, локализация;
- защита от CSRF, XSS, SQL-инъекций и clickjacking из коробки.
Минимальная страница на Django — представление и маршрут:
# shop/views.py
from django.http import JsonResponse
from django.shortcuts import get_object_or_404, render
from .models import Book
def book_detail(request, pk):
book = get_object_or_404(Book, pk=pk)
return render(request, "shop/book_detail.html", {"book": book})
def api_status(request):
return JsonResponse({"status": "ok"})
# shop/urls.py
from django.urls import path
from . import views
urlpatterns = [
path("books/<int:pk>/", views.book_detail, name="book_detail"),
path("api/status/", views.api_status),
]
Вокруг этого кода — проект, приложения, настройки и миграции. Порог входа выше, чем у Flask, но структура одинакова во всех Django-проектах, и новый разработчик быстро в ней ориентируется.
Для API к Django добавляют Django REST Framework — разбор в руководстве по DRF — или Django Ninja с подходом, похожим на FastAPI. Асинхронные представления Django поддерживает с версии 3.1, а асинхронные методы QuerySet (aget, acount и другие) — с 4.1.
Когда подходит: контентные сайты, интернет-магазины, CRM и бэк-офисы, сервисы с личным кабинетом, проекты, где нужна админка «на завтра».
С чего начать — в статье «Django для начинающих».
Flask: микрофреймворк
Flask даёт маршрутизацию, объект запроса, шаблоны Jinja2 и сервер разработки с отладчиком. Всё остальное — ORM, формы, авторизацию — выбирают из расширений: Flask-SQLAlchemy, Flask-WTF, Flask-Login, Flask-Migrate.
# app.py
from flask import Flask, render_template, request
app = Flask(__name__)
@app.route("/")
def index():
name = request.args.get("name", "гость")
return render_template("index.html", name=name)
@app.get("/api/status")
def status():
return {"status": "ok"} # словарь превращается в JSON
flask --app app run --debug
Целое приложение помещается в один файл, а структуру проекта вы определяете сами. Это плюс для небольших сервисов и обучения и минус для больших команд: в каждом Flask-проекте свой набор библиотек и свои соглашения.
Начиная с Flask 2.0 view можно объявлять через async def (Flask нужно установить с дополнительным набором: pip install "flask[async]"), но сам фреймворк остаётся WSGI: асинхронный view не освобождает воркер на время ожидания так, как это делает ASGI-фреймворк.
Когда подходит: небольшие сайты и внутренние инструменты, прототипы, простые API, учебные проекты, приложения с нестандартной архитектурой.
Пошагово — в статье «Flask для начинающих».
FastAPI: API на аннотациях типов
FastAPI построен на Starlette (веб-часть) и Pydantic (валидация данных). Параметры функции с аннотациями типов превращаются в правила валидации, а из них автоматически генерируется схема OpenAPI с интерактивной документацией на /docs.
# main.py
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Book(BaseModel):
title: str
author: str
year: int | None = None
@app.get("/books/{book_id}")
async def read_book(book_id: int):
return {"id": book_id}
@app.post("/books/")
async def create_book(book: Book):
return book
uvicorn main:app --reload
Запрос GET /books/abc получит ответ 422 с описанием ошибки: book_id должен быть целым числом. Тело POST-запроса без поля author тоже отклонится автоматически — проверку пишет Pydantic, а не вы. Подробнее о моделях — в статье про Pydantic.
FastAPI не навязывает ORM: обычно берут SQLAlchemy или SQLModel. Админки, системы пользователей и шаблонов «из коробки» нет — HTML-страницы можно рендерить через Jinja2, но фреймворк задуман для API.
Когда подходит: REST API для фронтенда на React/Vue и мобильных приложений, микросервисы, ML-модели за HTTP-интерфейсом, сервисы с большим количеством сетевых вызовов.
Подробно — в руководстве по FastAPI.
Litestar и Starlette: кратко
Starlette
Starlette — лёгкий ASGI-инструментарий: маршрутизация, запросы и ответы, WebSocket, middleware, фоновые задачи. На нём построен FastAPI. Напрямую Starlette берут, когда нужен минимальный асинхронный сервис без валидации и автодокументации:
from starlette.applications import Starlette
from starlette.responses import JSONResponse
from starlette.routing import Route
async def homepage(request):
return JSONResponse({"hello": "world"})
app = Starlette(routes=[Route("/", homepage)])
Litestar
Litestar (до выхода версии 2.0 в 2023 году — Starlite) — ASGI-фреймворк для API, ближайшая альтернатива FastAPI. Он тоже строит валидацию и OpenAPI-схему по аннотациям типов, поддерживает dataclasses, Pydantic и msgspec, а также внедрение зависимостей, плагин для SQLAlchemy, кеширование и шаблоны.
from litestar import Litestar, get
@get("/books/{book_id:int}")
async def read_book(book_id: int) -> dict[str, int]:
return {"id": book_id}
app = Litestar(route_handlers=[read_book])
В Litestar тип возвращаемого значения обязателен, а тип параметра пути указывается прямо в шаблоне маршрута. Сообщество и количество материалов на русском у Litestar заметно меньше, чем у FastAPI.
Другие фреймворки
Из других заметных проектов: Tornado — асинхронный фреймворк со своим сервером, исторически популярный для WebSocket; aiohttp — асинхронный HTTP-клиент и сервер; Pyramid — гибкий фреймворк, масштабируемый от одного файла до крупного приложения; Bottle — микрофреймворк в одном файле без зависимостей. Для новых проектов их выбирают реже, чем тройку Django, Flask и FastAPI.
Сравнение фреймворков Python
| Критерий | Django | Flask | FastAPI | Litestar |
|---|---|---|---|---|
| Тип | Full-stack | Микрофреймворк | API-фреймворк | API-фреймворк |
| Интерфейс | WSGI и ASGI | WSGI | ASGI | ASGI |
| ORM | Встроенная | Нет (Flask-SQLAlchemy) | Нет (SQLAlchemy, SQLModel) | Нет (плагин SQLAlchemy) |
| Админка | Встроенная | Нет (Flask-Admin) | Нет | Нет |
| Пользователи и права | Встроенные | Нет (Flask-Login) | Нет (пишутся вручную) | Нет (есть средства auth) |
| Валидация данных | Формы, сериализаторы DRF | Нет (Flask-WTF, marshmallow) | Pydantic | dataclasses, Pydantic, msgspec |
| OpenAPI-документация | Через DRF или Django Ninja | Через расширения | Автоматически | Автоматически |
| Шаблоны HTML | Django Templates или Jinja2 | Jinja2 | Jinja2 (опционально) | Jinja2, Mako и другие |
| Порог входа | Средний | Низкий | Низкий–средний | Средний |
Скорость в синтетических тестах часто приводят как главный аргумент, но в реальном приложении время ответа обычно определяют запросы к базе данных и внешним сервисам, а не накладные расходы фреймворка. Выбирайте по задаче и экосистеме, а не по графикам «запросов в секунду». Отдельное сравнение трёх главных вариантов — в статье FastAPI vs Django vs Flask.
Как выбрать фреймворк Python под задачу
| Задача | Что взять |
|---|---|
| Сайт с базой данных, пользователями и админкой | Django |
| Интернет-магазин, CRM, бэк-офис, личный кабинет | Django |
| JSON API для SPA или мобильного приложения | FastAPI или Django + DRF |
| Микросервис, ML-модель за HTTP | FastAPI |
| Много одновременных соединений, WebSocket | FastAPI, Litestar, Starlette |
| Небольшой сайт, прототип, внутренний инструмент | Flask |
| Первое веб-приложение для обучения | Flask или Django |
Несколько практических соображений:
- Нужна админка и стандартные функции сайта — берите Django. Собрать то же самое на Flask или FastAPI можно, но это недели работы над тем, что в Django уже есть.
- Фронтенд отдельно, бэкенд отдаёт только JSON — FastAPI даёт валидацию и документацию почти без кода. Если же API — часть большого проекта с админкой, логичнее Django REST Framework.
- Команда уже знает один из фреймворков — это весомый аргумент: стоимость переобучения часто выше разницы между инструментами.
- Учитесь — Flask показывает, как устроен веб без «магии», Django учит работать с полноценным проектом. Оба пути нормальны; FastAPI удобно изучать после того, как вы освоили основы HTTP и аннотации типов.
Как запускать приложение в продакшне
Встроенные серверы разработки (runserver в Django, flask run) не предназначены для продакшна. Боевая схема одинакова для всех фреймворков: обратный прокси (обычно Nginx) принимает запросы и отдаёт статику, а за ним работает сервер приложений:
- WSGI-приложения (Django, Flask) — Gunicorn, uWSGI; на Windows — Waitress, потому что Gunicorn там не работает;
- ASGI-приложения (FastAPI, Litestar, Starlette, асинхронный Django) — Uvicorn, Hypercorn, Daphne; Uvicorn также можно запускать как воркеры Gunicorn.
Пошаговая настройка на примере Django — в статье «Деплой Django: Gunicorn, Nginx и чек-лист продакшна».
Частые вопросы
Какой фреймворк Python учить первым?
Если цель — работа бэкенд-разработчиком, чаще всего в вакансиях встречаются Django и FastAPI. Для понимания основ веба удобно начать с Flask, а затем перейти к Django. Сначала стоит уверенно освоить сам язык — см. Python для начинающих.
Можно ли сделать сайт с HTML-страницами на FastAPI?
Да, через шаблоны Jinja2 и раздачу статики. Но формы, сессии, пользователей и админку придётся собирать самостоятельно, поэтому для «классического» сайта удобнее Django.
Django медленный?
Для большинства сайтов узкое место — база данных: лишние запросы, отсутствие индексов, проблема N+1. Django с грамотно написанными запросами обслуживает крупные проекты. Перейти на FastAPI ради скорости имеет смысл только там, где упор в ожидание сетевых операций и асинхронность даёт реальный выигрыш.
Можно ли совмещать фреймворки?
Да. Частая схема — Django для админки и основного сайта, а отдельный сервис на FastAPI для высоконагруженного API. Они могут работать с одной базой данных, но тогда схему базы и миграции должен контролировать кто-то один.
Чем фреймворк отличается от библиотеки?
Библиотеку вызывает ваш код: например, requests.get() выполняется, когда вы его вызвали. Фреймворк сам управляет ходом программы и вызывает ваши функции: Django или FastAPI принимает запрос, находит нужное представление по маршруту и передаёт ему данные. Поэтому фреймворк задаёт структуру проекта и соглашения, а библиотеку можно подключить в любом месте кода.
Итог
Django, Flask и FastAPI закрывают почти все задачи веб-разработки на Python: Django — полноценные сайты с админкой, Flask — небольшие и гибкие приложения, FastAPI — API с валидацией и документацией из аннотаций типов. Litestar и Starlette стоит рассмотреть для асинхронных API, когда вы знаете, зачем отходить от FastAPI. Следующий шаг — первое приложение: на Flask, на Django или на FastAPI. Все материалы по теме собраны в разделе «Веб-разработка на Python».
- #Python
- #Веб-фреймворки
- #Django
- #Flask
- #FastAPI
- #Litestar