Django-Admin.ru
Python · Веб-фреймворки★ Руководство

Фреймворки Python для веб-разработки: обзор и выбор

Обзор веб-фреймворков Python: Django, Flask, FastAPI, Litestar и Starlette — примеры кода, таблица сравнения и как выбрать фреймворк под задачу.

Редакция Django-Admin.ru
· обновлено · 11 мин чтения

Содержание · 10 разделов
  1. Что такое веб-фреймворк и зачем он нужен
  2. WSGI и ASGI: синхронные и асинхронные фреймворки
  3. Django: всё включено
  4. Flask: микрофреймворк
  5. FastAPI: API на аннотациях типов
  6. Litestar и Starlette: кратко
  7. Starlette
  8. Litestar
  9. Другие фреймворки
  10. Сравнение фреймворков Python
  11. Как выбрать фреймворк Python под задачу
  12. Как запускать приложение в продакшне
  13. Частые вопросы
  14. Какой фреймворк Python учить первым?
  15. Можно ли сделать сайт с HTML-страницами на FastAPI?
  16. Django медленный?
  17. Можно ли совмещать фреймворки?
  18. Чем фреймворк отличается от библиотеки?
  19. Итог

Фреймворки 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

КритерийDjangoFlaskFastAPILitestar
ТипFull-stackМикрофреймворкAPI-фреймворкAPI-фреймворк
ИнтерфейсWSGI и ASGIWSGIASGIASGI
ORMВстроеннаяНет (Flask-SQLAlchemy)Нет (SQLAlchemy, SQLModel)Нет (плагин SQLAlchemy)
АдминкаВстроеннаяНет (Flask-Admin)НетНет
Пользователи и праваВстроенныеНет (Flask-Login)Нет (пишутся вручную)Нет (есть средства auth)
Валидация данныхФормы, сериализаторы DRFНет (Flask-WTF, marshmallow)Pydanticdataclasses, Pydantic, msgspec
OpenAPI-документацияЧерез DRF или Django NinjaЧерез расширенияАвтоматическиАвтоматически
Шаблоны HTMLDjango Templates или Jinja2Jinja2Jinja2 (опционально)Jinja2, Mako и другие
Порог входаСреднийНизкийНизкий–среднийСредний

Скорость в синтетических тестах часто приводят как главный аргумент, но в реальном приложении время ответа обычно определяют запросы к базе данных и внешним сервисам, а не накладные расходы фреймворка. Выбирайте по задаче и экосистеме, а не по графикам «запросов в секунду». Отдельное сравнение трёх главных вариантов — в статье FastAPI vs Django vs Flask.

Как выбрать фреймворк Python под задачу

ЗадачаЧто взять
Сайт с базой данных, пользователями и админкойDjango
Интернет-магазин, CRM, бэк-офис, личный кабинетDjango
JSON API для SPA или мобильного приложенияFastAPI или Django + DRF
Микросервис, ML-модель за HTTPFastAPI
Много одновременных соединений, WebSocketFastAPI, 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
↑ ↓ выборEnter открытьEsc закрыть