Что это
Минималистичный веб-фреймворк для Python на базе WSGI и Jinja2: даёт маршрутизацию, обработчики и шаблоны, а базу, формы и авторизацию подключаешь расширениями по мере надобности.
Flask — минималистичный веб-фреймворк для Python на базе WSGI и Jinja2. Он даёт маленькое ядро — маршрутизацию, обработчики и шаблоны — и оставляет выбор базы, форм и авторизации за вами, подключая их расширениями.
Flask — минималистичный веб-фреймворк для Python, вышедший в 2010 году. Его идея противоположна «всё в комплекте»: вместо готовой ORM, форм и админки Flask даёт маленькое ядро — маршрутизацию запросов, обработчики, шаблоны Jinja2 поверх WSGI — и оставляет остальное на выбор разработчика. Отсюда его называют микрофреймворком: он не навязывает структуру проекта и подключается по кусочкам через расширения (Flask-SQLAlchemy для базы, Flask-Migrate для миграций, Flask-Login для сессий).
Цена свободы — ответственность: архитектуру, набор библиотек и границы модулей вы проектируете сами, и на большом проекте без дисциплины это превращается в хаос. Поэтому Flask особенно хорош там, где нужен контроль и лёгкость: небольшие сервисы, API, обёртки над ML-моделями, прототипы, микросервисы. Чаще всего его спрашивают с Python-разработчиков, а также с бэкенд-инженеров и ML-инженеров, которым нужно быстро отдать модель по HTTP.
Для этого навыка доступны ограниченные данные (менее 50 вакансий или нет зарплатных данных). Аналитика носит ориентировочный характер.
Минималистичный веб-фреймворк для Python на базе WSGI и Jinja2: даёт маршрутизацию, обработчики и шаблоны, а базу, формы и авторизацию подключаешь расширениями по мере надобности.
Прежде всего Python-разработчики, а также бэкенд- и ML-инженеры: Flask удобен, когда нужно быстро поднять API или обернуть модель в HTTP-сервис без тяжёлого каркаса.
Устойчиво востребованный навык в вакансиях на Python: часто идёт в паре с SQLAlchemy, Docker и Gunicorn. Реже мелькает как основной фреймворк, чем Django, но остаётся стандартом для лёгких сервисов и прототипов.
Flask — это тонкая обёртка вокруг двух библиотек: Werkzeug, которая разбирает HTTP-запрос по стандарту WSGI, и Jinja2, которая рендерит HTML-шаблоны. Всё ядро сводится к тому, чтобы связать входящий URL с функцией-обработчиком и вернуть ответ. Namного больше он из коробки не умеет — и это осознанный выбор: базу данных, валидацию форм, авторизацию, миграции вы добавляете отдельными пакетами, когда они реально нужны. В отличие от Django с его «батарейками в комплекте», Flask ничего не решает за вас, но и не мешает выстроить проект так, как удобно.
Сердце Flask — сопоставление URL с функцией. Декоратор @app.route("/users/<int:id>") привязывает адрес к обработчику, а Flask сам вытаскивает параметры из пути, разбирает строку запроса, тело и заголовки в объект request. Обработчик возвращает строку, готовый HTML через render_template или словарь, который Flask сериализует в JSON. Эта модель — «URL внутри, ответ наружу» — читается почти как псевдокод, поэтому на Flask так быстро собирается первый работающий сервис.
Пока в проекте пара обработчиков, они живут в одном файле, но растущий сервис так держать нельзя. Blueprints — способ разрезать приложение на модули: каждый со своими маршрутами, шаблонами и префиксом URL, которые потом регистрируются в общем приложении. Рядом идёт паттерн фабрики приложения — функция create_app(), которая собирает приложение и подключает расширения. Он развязывает конфигурацию (тесты, продакшн, локальная разработка) и убирает глобальное состояние — без этих двух приёмов Flask-проект среднего размера быстро превращается в спагетти.
Путь от входящего URL до ответа — три звена внутри фреймворка.
Маршрутизатор находит обработчик
Werkzeug разбирает WSGI-запрос, а Flask по URL и методу выбирает нужную функцию-обработчик, вытаскивая параметры пути и данные в объект request.
Обработчик формирует ответ
Функция работает с запросом: читает JSON или форму, обращается к базе через расширение, рендерит шаблон Jinja2 или возвращает словарь. Здесь живёт логика сервиса.
Flask отдаёт HTTP-ответ
Flask переносится между ролями: Python-разработчик, Бэкенд-разработчик, ML-инженер. В одном треке этот навык может быть основным рабочим инструментом, а в другом - сильным прикладным усилителем основной специализации.
Python-разработчик — самый заметный профиль в распределении ролей по навыку.
Ещё 2 ролей используют Flask
Текущий срез показывает активные вакансии сейчас. Распределение по ролям рассчитано по расширенной исторической выборке, поэтому значения могут быть выше текущего количества активных вакансий.
Flask ценен не абстрактным знанием инструмента, а повторяющимися рабочими задачами — ниже они разобраны так, как встречаются в реальной работе.
Маршрут и обработчик
Базовый кирпич Flask: декоратор связывает URL с функцией, параметры пути прилетают в аргументы.
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
return "Привет, Flask"
@app.route("/users/<int:user_id>")
def show_user(user_id):
# тип <int:...> Flask проверяет сам
return f"Пользователь {user_id}"
if __name__ == "__main__":
app.run(debug=True) JSON-API и разбор запроса
Приём POST с телом JSON и ответ словарём — типичный эндпоинт REST-сервиса.
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route("/api/tasks", methods=["POST"])
def create_task():
data = request.get_json() # тело запроса как dict
title = data.get("title")
if not title:
return jsonify(error="title обязателен"), 400
# ... сохранение в базу ...
return jsonify(id=1, title=title), 201 Шаблон Jinja2
Серверный рендеринг страницы: обработчик передаёт данные, Jinja2 подставляет их в HTML.
from flask import Flask, render_template
app = Flask(__name__)
@app.route("/report")
def report():
rows = [{"name": "Анна", "score": 92},
{"name": "Пётр", "score": 78}]
return render_template("report.html", rows=rows)
# templates/report.html:
# <table>
# {% for r in rows %}
# <tr><td>{{ r.name }}</td><td>{{ r.score }}</td></tr>
# {% endfor %}
# </table> Blueprint: модуль приложения
Разрезаем растущий проект на части — свой набор маршрутов с общим префиксом URL.
# users/routes.py
from flask import Blueprint, jsonify
users = Blueprint("users", __name__, url_prefix="/users")
@users.route("/")
def list_users():
return jsonify(users=["Анна", "Пётр"])
# app.py
from flask import Flask
from users.routes import users
app = Flask(__name__)
app.register_blueprint(users) # маршруты подключены Фабрика приложения
Собираем приложение функцией и подключаем расширения — развязка конфигураций и никакого глобального состояния.
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
def create_app(config="config.Production"):
app = Flask(__name__)
app.config.from_object(config)
db.init_app(app) # расширение привязано к приложению
from users.routes import users
app.register_blueprint(users)
return app Модель и запрос к базе
Flask-SQLAlchemy: описываем таблицу классом и работаем с ней как с объектами Python.
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80), nullable=False)
email = db.Column(db.String(120), unique=True)
# создать пользователя
user = User(name="Анна", email="anna@example.com")
db.session.add(user)
db.session.commit()
# найти
found = User.query.filter_by(name="Анна").first() Прототип на паре роутов растёт, а код остаётся в единственном app.py — маршруты, модели, логика вперемешку. Без blueprints и фабрики приложения проект среднего размера превращается в неподдерживаемый ком. Разбивать на модули стоит раньше, чем станет совсем больно.
Режим отладки удобен локально, но на боевом сервере это дыра: при ошибке Flask показывает интерактивную консоль с выполнением кода. debug=True — только для разработки; в проде отладчик выключают и запускают приложение под Gunicorn или uWSGI.
Встроенный сервер разработки не рассчитан на нагрузку и не держит параллельные запросы как надо. В бою Flask ставят за полноценный WSGI-сервер (Gunicorn, uWSGI) с несколькими воркерами и за Nginx. app.run() — только локально.
Писать своё вместо проверенных Flask-SQLAlchemy, Flask-Migrate, Flask-Login — тратить время и плодить ошибки там, где есть стандартные решения. Минимализм Flask не значит «пиши всё сам»; значит «подключай нужное осознанно».
«Микрофреймворк — значит для учебных проектов» — расхожее заблуждение. Flask прекрасно работает в продакшне: blueprints, фабрика приложения, расширения, деплой под Gunicorn дают полноценный сервис. Несерьёзным его делает не фреймворк, а отсутствие архитектуры.
Flask — устойчиво востребованный навык в вакансиях на Python, хотя реже фигурирует как главный фреймворк проекта, чем Django. Его спрашивают прежде всего с Python-разработчиков, а также с бэкенд- и ML-инженеров, которым нужно быстро отдать логику или модель по HTTP. В требованиях Flask почти всегда идёт не один: рядом стоят SQLAlchemy для базы, Docker и Gunicorn для деплоя, а часто и FastAPI — работодатели ждут человека, который выберет инструмент под задачу. От кандидата хотят не «пары роутов», а умения строить модульную архитектуру на blueprints, подключать расширения и покрывать код тестами. Flask ценят как навык, показывающий, что человек понимает веб на уровне HTTP, а не только внутри готового каркаса.
Flask ценят не за знание термина, а за конкретную пользу в ежедневной работе команды.
Навык редко существует изолированно: он встроен в процессы, инструменты и смежные роли, поэтому спрос держится дольше.
Специалист с Flask быстрее проверяет гипотезы, решает задачи и меньше зависит от ручной передачи работы между людьми.
Flask формирует устойчивый спрос внутри своего рабочего сегмента.
Flask сохраняет устойчивый прикладной спрос на рынке: 67 активных вакансий, #160 по рынку, 1% IT-вакансий. Ниже показано число открытых вакансий на конец каждого месяца: это исторический ряд по состоянию на конец месяца, а не текущий срез рынка на сегодня.
#160 по рынку • 1% IT-вакансий
-1 вакансий и -1% к предыдущему месяцу.
Flask редко живёт изолированно: чаще всего рынок видит его рядом с Python, FastAPI, Docker. Самая плотная связка сейчас - Python: оба навыка встречаются вместе в 99% вакансий.
Главная связка: Python • 99% вакансий. Показываем общерыночные связки Flask: не junior-минимум из блока выше, а навыки, которые чаще всего встречаются рядом с ним в одной вакансии.
навыки, которые рынок чаще всего видит рядом в одной вакансии
Сейчас на рынке 3 активных junior-вакансий с Flask. Это 5.9% всех вакансий по навыку, поэтому для старта важнее всего смотреть на реальный объём junior-окна и на стек, который рынок ждёт рядом.
5.9% всех вакансий по навыку • Senior / Junior 8.6x
Окно входа узкое: рынок чаще нанимает с опытом.
Медианная вакансия с Flask ожидает около 18 навыков в стеке. Это широкий стартовый набор: рынок обычно ищет не один изолированный инструмент, а рабочую комбинацию соседних навыков.
Владение Flask в резюме показывает, что вы умеете создавать веб-приложения и API на Python. На разных уровнях от вас ждут разного объёма знаний и самостоятельности.
С чем Flask работает в реальных проектах.
ORM и подключение к базе данных
Когда сервису нужно постоянное хранилище
Тянет зависимость и версионную совместимость на вас.
Миграции схемы поверх Alembic
Когда структура базы меняется по ходу проекта
Требует аккуратности с историей миграций в команде.
Продакшн WSGI-сервер
Запуск Flask под реальной нагрузкой
Встроенный app.run() для боя не годится.
Шаблонизатор для серверного HTML
Когда страницы рендерит сервер, а не фронтенд
Сериализация и валидация данных API
Когда нужен строгий контракт JSON-эндпоинтов
Добавляет схемы, которых нет в ядре Flask.
Flask применяют там, где важны лёгкость и контроль: REST API и микросервисы, обёртки над ML-моделями, прототипы и небольшие серверные приложения.
ML-инженеры оборачивают обученную модель в HTTP-эндпоинт: пришёл запрос — вернулось предсказание. Flask здесь популярен именно потому, что не тащит лишнего: тонкий...
Быстрый способ превратить Python-скрипт в веб-сервис: админ-панель, дашборд, форма для команды. Когда важна скорость до первого работающего результата, минимализм...
Небольшие сайты и страницы, которые отдаёт сервер: лендинги, формы обратной связи, простые CRUD-приложения на Jinja2 с базой через Flask-SQLAlchemy. Классический...
Flask заметен в 2 направлениях рынка с долей выше 5%.
Возможности, за которые Flask выбирают для лёгких сервисов и API.
Первый работающий сервис — несколько строк: приложение, маршрут, обработчик. Минимум церемоний между идеей и запущенным HTTP-эндпоинтом.
Никакой навязанной ORM и структуры: базу, формы, авторизацию подключаешь расширениями под задачу. Проект собирается ровно из того, что нужно.
Серверный рендеринг HTML с наследованием шаблонов, циклами и автоэкранированием против XSS — готов сразу, без отдельной установки.
Flask-SQLAlchemy, Flask-Migrate, Flask-Login, Flask-WTF и другие закрывают типовые потребности проверенными решениями.
Три Python-фреймворка для веба — у каждого своя зона.
Django идёт со всем в комплекте — ORM, админка, авторизация, миграции — и быстро запускает большое типовое приложение по проложенным рельсам, тогда как Flask даёт минимальное ядро и свободу собрать...
FastAPI построен на асинхронном ASGI, из коробки даёт валидацию через Pydantic и автодокументацию и выигрывает на асинхронных API под нагрузкой, а Flask синхронен на WSGI, но проще, стабильнее и...
Можно писать веб-сервис прямо на Werkzeug или чистом WSGI, но тогда маршрутизацию, разбор запроса и рендеринг приходится собирать руками. Flask даёт ровно эту прослойку удобства поверх WSGI,...
Типовая структура Flask-приложения с Application Factory и Blueprints — облегчает тестирование и рост проекта.
Фабрика приложения create_app() — инициализация расширений (SQLAlchemy, Migrate) и регистрация blueprints.
Модели SQLAlchemy — описание таблиц и связей между ними.
Модули по доменам: auth, api, admin — каждый со своими маршрутами и шаблонами.
Классы конфигурации Config/DevConfig/ProdConfig — переключение через переменную окружения FLASK_ENV.
Alembic-миграции через Flask-Migrate — версионирование схемы БД.
Точка входа для production WSGI-сервера (Gunicorn/uWSGI): from app import create_app; app = create_app().
Функция create_app() вместо модульного app = Flask(__name__) упрощает тестирование и запуск с разными конфигурациями (dev/test/prod).
Config/DevConfig/ProdConfig вместо хардкода значений — переключение окружения одной переменной, без правки кода.
Разбивайте большое приложение на модули по доменам (auth, api, admin) вместо одного огромного файла routes.py.
Werkzeug-дебаггер в проде даёт возможность выполнения произвольного кода через веб-консоль — критичная уязвимость.
Не проверяйте входные данные вручную — сериализация и валидация через готовые библиотеки исключает целый класс ошибок.
Не оставляйте висящие транзакции. Закрывайте сессию явно в finally или через контекстный менеджер.
Используйте встроенный логгер Flask вместо print() — управляемые уровни логирования и вывод в файл/агрегатор.
Встроенный dev-сервер Flask не предназначен для продакшена. Используйте Gunicorn или uWSGI за реверс-прокси (nginx).
Никогда не конкатенируйте пользовательский ввод в SQL-запросы. Используйте SQLAlchemy — он экранирует параметры.
В шаблонах Jinja2 используйте фильтр `| safe` только для проверенного контента. Экранируйте всё, что приходит от пользователя.
Никогда не храните `app.secret_key = 'super_secret_123'` в коде. Используйте переменные окружения.
Установите флаги `HttpOnly`, `Secure` и `SameSite='Strict'` для файлов cookie, чтобы предотвратить кражу сессий.
Если используете формы, подключайте Flask-WTF. Он добавляет скрытый CSRF-токен в каждую форму.
Даже для небольших проектов ограничивайте частоту запросов. Используйте Flask-Limiter.
Настройте Flask-CORS, указывая явно разрешённые домены. Не используйте `origins='*'` без крайней необходимости.
Валидируйте все данные из `request.form` и `request.json`. Используйте Marshmallow или Pydantic для строгой схемы.
Django идёт со всем в комплекте: ORM, админка, формы, авторизация, миграции — быстрый старт для большого приложения по проложенным рельсам. Flask даёт минимум и полную свободу выбора. Django выбирают под крупный монолит с типовыми потребностями, Flask — под лёгкий сервис, где не нужен тяжёлый каркас.
FastAPI построен на асинхронном ASGI, из коробки даёт валидацию через Pydantic и автодокументацию, и выигрывает на асинхронных API под нагрузкой. Flask синхронен на WSGI, но проще, стабильнее и с огромной экосистемой расширений. Для нового чистого API часто берут FastAPI, Flask держится зрелостью и универсальностью.
Там, где нужны админка, готовая авторизация и типовой CRUD «из коробки» для крупного приложения, Django экономит недели. Собирать то же самое на Flask из расширений — работать руками там, где есть готовое решение. Flask силён в лёгких сервисах, а не в замене полнофункционального каркаса.
Модель WSGI обрабатывает запросы синхронно, и на задачах с массой одновременных ожиданий ввода-вывода Flask проигрывает асинхронным фреймворкам без ухищрений. Масштабируют его воркерами Gunicorn, но если асинхронность нужна изначально, ASGI-фреймворк подойдёт лучше.
Перспективы Flask завязаны не только на текущем спросе, но и на том, как навык встраивается в новые платформы, инструменты и рабочие контуры.
Flask добавил поддержку async-обработчиков, сокращая разрыв с ASGI-фреймворками для отдельных задач. Полноценной асинхронной моделью WSGI это не делает, но снимает часть...
Фронтенд всё чаще живёт отдельно на React или Vue, а Flask работает как чистый JSON-API без шаблонов. Роль серверного рендеринга снижается, зато растёт спрос на компактные...
С ростом ML- и AI-инженерии множится задача «отдать модель по HTTP». Лёгкий сервис вокруг модели или вокруг вызова языковой модели — типовой сценарий, и Flask остаётся...
Сервис управления задачами: CRUD-эндпоинты, база через Flask-SQLAlchemy, миграции через Flask-Migrate, разбиение на blueprints, фабрика приложения, тесты через test_client. Показывает не пару роутов, а поддерживаемую...
Тонкий Flask-сервис, отдающий предсказания обученной модели: приём запроса, десериализация модели, ответ JSON, упаковка в Docker и запуск под Gunicorn. Демонстрирует Flask в реальной нише — быстрый мост между...
Flask — один из самых дружелюбных фреймворков для входа: первый работающий сервис пишется за вечер. Сложность не в синтаксисе, а в том, чтобы вырастить прототип в поддерживаемую архитектуру — blueprints, фабрика приложения, разумный набор расширений.
Первое приложение и маршруты
Шаблоны Jinja2
Рендеринг страниц через render_template: передача данных, циклы, условия, наследование шаблонов, автоэкранирование. Достаточно для серверных страниц и...
База данных через расширения
Подключить Flask-SQLAlchemy, описать модели, научиться делать запросы. Добавить Flask-Migrate для миграций схемы. Здесь Flask из игрушки превращается в...
Blueprints и фабрика приложения
Разрезать растущий проект на модули через blueprints, собрать приложение фабрикой create_app(), развести конфигурации для тестов и продакшна. Ключевой...
Соответствие — доля тем навыка, которые охватывает программа курса
Три шага от первого маршрута до реального сервиса.
Установить Flask, поднять приложение, написать пару маршрутов через @app.route, вернуть строку и JSON. Разобрать объект request и методы GET/POST. Первый работающий сервис — за вечер.
Научиться рендерить страницы через Jinja2, подключить Flask-SQLAlchemy, описать модели и сделать CRUD. Здесь Flask из демо превращается в настоящее приложение с данными.
Разрезать проект на blueprints, собрать фабрику приложения create_app(), покрыть эндпоинты тестами через test_client и упаковать в Docker под Gunicorn. Переход от скрипта к рабочему сервису.
Для Flask важнее всего быстро перейти к документации и стартовым материалам, а рынок и зарплаты уже помогают понять ценность навыка.
Да, если вы работаете с Python и вам нужен веб. Flask быстро входит, учит понимать веб на уровне HTTP, а не внутри готового каркаса, и остаётся стандартом для лёгких сервисов, API и обёрток над ML-моделями. Разумно знать его в связке с FastAPI и Django, чтобы выбирать инструмент под задачу.
Django идёт со всем в комплекте — ORM, админка, авторизация, миграции — и быстро запускает большое типовое приложение. Flask даёт минимальное ядро и свободу собрать стек самому из расширений. Django под крупный монолит по рельсам, Flask под лёгкий сервис, где не нужен тяжёлый каркас.
FastAPI построен на асинхронном ASGI, даёт валидацию через Pydantic и автодокументацию — сильный выбор для нового API под нагрузкой. Flask синхронен, но проще, стабильнее и с огромной экосистемой расширений. Для чистого асинхронного API чаще берут FastAPI; Flask выигрывает зрелостью и универсальностью.
Способ разрезать приложение на модули: каждый blueprint содержит свои маршруты, шаблоны и префикс URL, а потом регистрируется в общем приложении. Без них растущий Flask-проект превращается в один огромный файл. Blueprints вместе с фабрикой приложения — основа поддерживаемой архитектуры.
Да. Микрофреймворк не значит «для учебных проектов»: с blueprints, фабрикой приложения, расширениями и запуском под Gunicorn за Nginx Flask держит боевые сервисы. Важно не оставлять debug=True и встроенный сервер разработки в бою — это про эксплуатацию, а не про сам фреймворк.
Нет, из коробки Flask о базе ничего не знает. Когда база нужна, подключают расширение Flask-SQLAlchemy для ORM и Flask-Migrate для миграций схемы. Это осознанный минимализм: вы добавляете хранилище, только когда оно реально требуется, а не тащите его с первого дня.
Первое работающее приложение с маршрутами пишется за вечер, базовый CRUD с базой — за несколько дней. Основное время уходит не на синтаксис, а на архитектуру: blueprints, фабрику приложения, расширения, тесты и деплой. Именно эти навыки отличают учебный проект от рабочего сервиса.