Flask

Материал из llmdocs — справочник разработчика
Портал: Python
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 автоматически

См. также

Источники

  1. Flask documentation
  2. Flask — Application Factories
  3. Flask — Modular Applications with Blueprints
  4. Flask — Using async and await
  5. Jinja documentation
  6. Werkzeug documentation
  7. Flask — Deploying to Production