Flask — это микрофреймворк для веб-разработки на Python: минимальное ядро (маршрутизация, обработка запросов) плюс шаблонизатор Jinja2 и набор инструментов Werkzeug поверх WSGI. В отличие от полнофункциональных фреймворков Flask не навязывает структуру проекта и не тянет за собой ORM или админку — это осознанный выбор, а не недостаток. В статье разберем, чем Flask отличается от Django, как его поставить и как написать и запустить первое рабочее приложение.
Содержание
Flask и Django: в чем разница
Оба инструмента решают задачу веб-разработки на Python, но по-разному распределяют ответственность между фреймворком и разработчиком.
| Критерий | Flask | Django |
|---|---|---|
| Тип | микрофреймворк, ядро минимально | полнофункциональный (batteries included) |
| ORM, админка, аутентификация | нет из коробки, ставятся отдельно | входят в комплект |
| Структура проекта | не навязана, свободная | заданная, единая для всех проектов |
| Порог входа | ниже, видно каждый компонент | выше, но меньше ручной сборки |
| Типичная задача | небольшой сайт, API, микросервис, обучение | продукт с типовым набором (интернет-магазин, блог, CRM) |
Упрощенно: Flask дает конструктор, Django — готовый набор деталей под конкретную задачу. Если нужен полный контроль и минимум зависимостей — берут Flask; если нужен предсказуемый результат без сборки инфраструктуры с нуля — Django. Однозначно лучшего варианта нет, выбор зависит от масштаба проекта и того, сколько решений вы готовы принимать сами.
Установка Python, venv и Flask
Для работы нужен Python версии 3.9 или новее (актуальные версии Flask ориентируются на поддерживаемые ветки Python; для новых проектов в 2026 году разумно ставить Python 3.11-3.12). Дистрибутив можно скачать с python.org.
Перед установкой Flask создайте виртуальное окружение — так зависимости проекта не смешаются с системным Python:
python3 -m venv venv
source venv/bin/activate
На Windows активация окружения выполняется командой venv\Scripts\activate.
Внутри активного окружения ставим Flask через pip:
pip install flask
Проверить, что пакет встал и увидеть версию, можно так:
python -c "import flask; print(flask.__version__)"
В консоли появится номер версии — на момент проверки (2026-09-19, чистое окружение, pip install flask) командой ставится Flask 3.1.3; при установке в другой день число может быть другим.
Первое приложение Flask целиком
Ниже — минимальный рабочий пример: один файл, который можно скопировать, сохранить как app.py и сразу запустить.
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
return "Hello, World!"
if __name__ == "__main__":
app.run(debug=True)
Запуск из консоли внутри активного виртуального окружения:
python app.py
В консоли появится примерно такой вывод (проверено на Flask 3.1.3, 2026-09-19; точный текст может отличаться между минорными версиями Flask/Werkzeug, но общий смысл сохраняется):
* Serving Flask app 'app'
* Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on http://127.0.0.1:5000
Press CTRL+C to quit
* Restarting with stat
* Debugger is active!
* Debugger PIN: (случайное значение, свое при каждом запуске)
Строка WARNING и три строки про отладчик (Restarting/Debugger is active/Debugger PIN) появляются именно из-за debug=True — без него сервер выведет только первые четыре строки, без предупреждения и без отладчика.
После этого нужно открыть в браузере адрес http://127.0.0.1:5000/ — на странице появится текст «Hello, World!». Сервер продолжает работать в консоли, пока вы его не остановите сочетанием Ctrl+C.
Как устроен код построчно
from flask import Flask— импортирует классFlask, вокруг которого строится приложение.app = Flask(__name__)— создает экземпляр приложения;__name__нужен фреймворку, чтобы правильно определить путь к статическим файлам и шаблонам относительно текущего модуля.@app.route("/")— декоратор, который связывает URL/(главную страницу) с функцией ниже.def index(): return "Hello, World!"— функция-обработчик (view-функция): она выполняется при обращении к/и возвращает содержимое ответа.if __name__ == "__main__": app.run(debug=True)— запускает встроенный сервер разработки, но только если файл запущен напрямую (python app.py), а не импортирован как модуль в другой скрипт.
Второй маршрут и параметры в URL
Один маршрут — это только начало. Flask позволяет принимать часть URL как параметр функции:
@app.route("/hello/<name>")
def hello(name):
return f"Привет, {name}!"
Если открыть http://127.0.0.1:5000/hello/Anna, в браузере появится «Привет, Anna!» — значение из адресной строки Flask сам передал в переменную name. Так строится большинство простых API и страниц с динамическим содержимым: один маршрут обслуживает целый класс адресов, а не один фиксированный URL.
Типичная ошибка: одинаковые имена view-функций
Начинающие часто копируют шаблон обработчика и забывают переименовать функцию:
@app.route("/")
def index():
return "Главная"
@app.route("/about")
def index():
return "О проекте"
При запуске это приведет к ошибке уже на этапе импорта:
AssertionError: View function mapping is overwriting an existing endpoint function: index
Flask использует имя функции как идентификатор маршрута (endpoint), и два одинаковых имени конфликтуют. Исправление — дать функциям разные имена:
@app.route("/")
def index():
return "Главная"
@app.route("/about")
def about():
return "О проекте"
Режим отладки: debug=True только для разработки
Параметр app.run(debug=True) включает автоматическую перезагрузку сервера при изменении кода и подробную страницу с трассировкой при ошибке — это удобно во время разработки. В боевом окружении так запускать приложение не стоит: отладочная страница может показать посетителю часть исходного кода и переменных, а встроенный сервер Werkzeug не рассчитан на продакшен-нагрузку. Для развертывания используют WSGI-сервер вроде Gunicorn или uWSGI за обратным прокси, а флаг debug в production отключают или не задают вовсе.
Выводы
- Flask — микрофреймворк: минимальное ядро плюс Jinja2 и Werkzeug, остальное подключается расширениями по необходимости.
- В отличие от Django он не навязывает структуру проекта и не включает ORM или админку из коробки.
- Приложение можно поставить и запустить за несколько команд:
venv,pip install flask,app.pyсFlask(__name__),@app.routeиapp.run(). - Параметры в URL (
<name>) позволяют одному маршруту обслуживать целый класс адресов. debug=True— только для разработки, для боевого запуска нужен отдельный WSGI-сервер.
Где применяется / связь с практикой
Освойте тему на практике
Flask на практике используют для небольших сайтов, внутренних сервисов, прототипов и REST API — там, где важна прозрачность кода и не нужен весь набор инструментов Django. Разобраться в веб-разработке на Python с нуля, включая работу с Flask и смежными темами, можно на курсе Python Basic — там разбирают базовый синтаксис, работу с данными и первые веб-приложения под руководством практикующих разработчиков. Проверить формат обучения и задать вопросы преподавателю можно на открытых уроках Otus.
Смежные темы: Введение в API для новичков, Потоки (threads) в Python.
FAQ
Нужно ли знать Django, чтобы начать с Flask?
Нет, это независимые фреймворки. Django полезно знать для сравнения архитектурных подходов, но для старта с Flask достаточно базового Python.
Можно ли использовать Flask для API без HTML-страниц?
Да, это одно из самых частых применений: view-функция просто возвращает JSON (например, через flask.jsonify) вместо текста или шаблона.
Обязательно ли использовать Jinja2 в проекте на Flask?
Нет, шаблонизатор нужен только если вы рендерите HTML-страницы на сервере. Для чистого API можно вообще не подключать шаблоны.



