Flask в Python: с чего начать и как запустить первое приложение

Flask в Python: с чего начать и как запустить первое приложение Полезное

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 можно вообще не подключать шаблоны.

OTUS Журнал
Скидка 5% 14-20 сентября на курсы (popup)