Flask
| Язык | Python |
|---|---|
| Автор | Армин Ронахер |
| Первый выпуск | апрель 2010 |
| Разработчик | Pallets Projects |
| Основа | Werkzeug (WSGI), Jinja2 (шаблоны), Click (CLI) |
| Тип | микрофреймворк, WSGI |
| Лицензия | BSD-3-Clause |
Flask — минималистичный веб-фреймворк на Python, так называемый микрофреймворк. Его ядро умеет немногое: маршрутизацию URL, обработку HTTP-запросов и ответов, шаблоны Jinja2, сессии на подписанных cookie и встроенный сервер разработки. Базу данных, формы, аутентификацию и прочее подключают расширениями или собственным кодом.[1] Благодаря простоте Flask популярен для небольших сервисов, внутренних инструментов, API, прототипов и обёрток над ML-моделями.
История
Flask написал австрийский программист Армин Ронахер. Он вырос из первоапрельской шутки 2010 года — фреймворка Denied, упакованного в один файл, — которая неожиданно понравилась сообществу. Flask собрал воедино две уже существовавшие библиотеки того же автора: Werkzeug — набор утилит для WSGI[6] — и шаблонизатор Jinja2.[5] Сегодня проект развивает сообщество Pallets, куда также входят Click, MarkupSafe и ItsDangerous; версия 1.0 вышла в 2018 году, 2.0 (с поддержкой async) — в 2021-м, 3.0 — в 2023-м.
Минимальное приложение
from flask import Flask, jsonify, request, abort
app = Flask(__name__)
TODOS = {1: "купить молоко"}
@app.get("/todos")
def list_todos():
return jsonify(TODOS)
@app.post("/todos")
def add_todo():
text = (request.get_json() or {}).get("text")
if not text:
abort(400, "text required")
new_id = max(TODOS, default=0) + 1
TODOS[new_id] = text
return {"id": new_id}, 201
uv add flask
uv run flask --app app run --debug
Маршруты объявляются декораторами, функция-обработчик возвращает строку, словарь (автоматически превращается в JSON), кортеж с кодом состояния или объект Response. Объекты request, session и g — контекстные локальные: выглядят как глобальные, но указывают на данные текущего запроса.
Шаблоны
Jinja2 поддерживает наследование шаблонов, циклы, фильтры и макросы; HTML-экранирование включено по умолчанию, что защищает от XSS.
{% extends "base.html" %}
{% block content %}
<ul>{% for t in todos %}<li>{{ t.text }}</li>{% endfor %}</ul>
{% endblock %}
Структура больших приложений
- Фабрика приложений — функция
create_app(), которая создаёт и настраивает экземпляр; удобно для тестов и разных конфигураций.[2] - Blueprints — модули с собственными маршрутами, шаблонами и статикой, которые регистрируются в приложении:
app.register_blueprint(auth_bp, url_prefix="/auth").[3] - Конфигурация — из объекта, файла или переменных окружения (
app.config.from_prefixed_env()).
Экосистема расширений
| Задача | Расширение |
|---|---|
| ORM и БД | Flask-SQLAlchemy, Flask-Migrate (Alembic) |
| Формы и CSRF | Flask-WTF |
| Вход пользователей | Flask-Login |
| JWT | Flask-JWT-Extended |
| REST API и OpenAPI | flask-smorest, APIFlask |
| CORS | Flask-CORS |
| Кэш | Flask-Caching |
Свобода выбора — главное достоинство и главный недостаток: каждый проект собирает свой стек, и решения о безопасности (например, защита от CSRF) остаются на разработчике.
Тестирование
Flask предоставляет тестовый клиент, который отправляет запросы без запуска сервера; его удобно использовать с pytest:
def test_add(client):
r = client.post("/todos", json={"text": "проверить"})
assert r.status_code == 201
Асинхронность
С версии 2.0 обработчики можно объявлять через async def, но Flask остаётся WSGI-фреймворком: каждая асинхронная функция выполняется в отдельном цикле событий внутри потока, и выигрыша в конкурентности, как у ASGI-фреймворков, это не даёт.[4] Для полностью асинхронного кода есть совместимый по API Quart, а для новых API часто выбирают FastAPI.
Развёртывание
Встроенный сервер (flask run) предназначен только для разработки. В продакшене приложение запускают WSGI-сервером — Gunicorn, uWSGI, Waitress — за обратным прокси (nginx, Caddy), часто в контейнере Docker.[7]
gunicorn -w 4 -b 127.0.0.1:8000 "app:create_app()"
Сравнение
| Flask | Django | FastAPI | |
|---|---|---|---|
| Подход | минимальное ядро | всё в комплекте | API с типами |
| Протокол | WSGI | WSGI/ASGI | ASGI |
| ORM, админка | расширения | встроены | нет |
| Валидация | вручную/расширения | формы | Pydantic |
| Документация API | расширения | DRF | OpenAPI автоматически |