# Flask

> Минималистичный веб-фреймворк на Python — маршрутизация, запросы и шаблоны Jinja2 в ядре, всё остальное через расширения; популярен для небольших сервисов, API и прототипов.

Источник: https://llmdocs.ru/wiki/flask/ · обновлено 2026-11-09 · лицензия CC BY-SA 4.0

- **Язык**: Python
- **Автор**: Армин Ронахер
- **Первый выпуск**: апрель 2010
- **Разработчик**: Pallets Projects
- **Основа**: Werkzeug (WSGI), Jinja2 (шаблоны), Click (CLI)
- **Тип**: микрофреймворк, WSGI
- **Лицензия**: BSD-3-Clause
**Flask** — минималистичный веб-фреймворк на [Python](https://llmdocs.ru/wiki/python.md), так называемый *микрофреймворк*. Его ядро умеет немногое: маршрутизацию URL, обработку [HTTP](https://llmdocs.ru/wiki/http.md)-запросов и ответов, шаблоны 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-м.

## Минимальное приложение

```python
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
```

```bash
uv add flask
uv run flask --app app run --debug
```

Маршруты объявляются [декораторами](https://llmdocs.ru/wiki/decorators.md), функция-обработчик возвращает строку, словарь (автоматически превращается в [JSON](https://llmdocs.ru/wiki/json.md)), кортеж с кодом состояния или объект `Response`. Объекты `request`, `session` и `g` — **контекстные локальные**: выглядят как глобальные, но указывают на данные текущего запроса.

## Шаблоны

Jinja2 поддерживает наследование шаблонов, циклы, фильтры и макросы; HTML-экранирование включено по умолчанию, что защищает от [XSS](https://llmdocs.ru/wiki/xss.md).

```html
{% 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]
- Конфигурация — из объекта, файла или [переменных окружения](https://llmdocs.ru/wiki/environment-variables.md) (`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](https://llmdocs.ru/wiki/csrf.md)) остаются на разработчике.

## Тестирование

Flask предоставляет тестовый клиент, который отправляет запросы без запуска сервера; его удобно использовать с [pytest](https://llmdocs.ru/wiki/pytest.md):

```python
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](https://llmdocs.ru/wiki/fastapi.md).

## Развёртывание

Встроенный сервер (`flask run`) предназначен только для разработки. В продакшене приложение запускают WSGI-сервером — Gunicorn, uWSGI, Waitress — за [обратным прокси](https://llmdocs.ru/wiki/reverse-proxy.md) ([nginx](https://llmdocs.ru/wiki/nginx.md), [Caddy](https://llmdocs.ru/wiki/caddy.md)), часто в контейнере [Docker](https://llmdocs.ru/wiki/docker.md).[7]

```bash
gunicorn -w 4 -b 127.0.0.1:8000 "app:create_app()"
```

## Сравнение

| | Flask | [Django](https://llmdocs.ru/wiki/django.md) | [FastAPI](https://llmdocs.ru/wiki/fastapi.md) |
|---|---|---|---|
| Подход | минимальное ядро | всё в комплекте | API с типами |
| Протокол | WSGI | WSGI/ASGI | ASGI |
| ORM, админка | расширения | встроены | нет |
| Валидация | вручную/расширения | формы | Pydantic |
| Документация API | расширения | DRF | OpenAPI автоматически |

## См. также

- [Django](https://llmdocs.ru/wiki/django.md)
- [FastAPI](https://llmdocs.ru/wiki/fastapi.md)
- [REST](https://llmdocs.ru/wiki/rest.md)
- [Dataclasses и Pydantic](https://llmdocs.ru/wiki/dataclasses-pydantic.md)

## Источники

1. [Flask documentation](https://flask.palletsprojects.com/)
2. [Flask — Application Factories](https://flask.palletsprojects.com/en/stable/patterns/appfactories/)
3. [Flask — Modular Applications with Blueprints](https://flask.palletsprojects.com/en/stable/blueprints/)
4. [Flask — Using async and await](https://flask.palletsprojects.com/en/stable/async-await/)
5. [Jinja documentation](https://jinja.palletsprojects.com/)
6. [Werkzeug documentation](https://werkzeug.palletsprojects.com/)
7. [Flask — Deploying to Production](https://flask.palletsprojects.com/en/stable/deploying/)
