Установка, виртуальное окружение и первый запуск
Перед первой строкой кода нужно изолированное окружение: отдельная песочница с Python и Flask, которая не конфликтует с другими проектами.
Виртуальное окружение — это папка со своей копией интерпретатора и пакетов. Установил туда Flask — он есть только в этом проекте. Удалил папку — и следов не осталось. Без этого пакеты разных проектов перемешиваются и ломают друг друга.
Зачем вообще окружение? Представь, что проект А требует Flask 2.3, а проект Б — Flask 3.1. Если ставить пакеты «глобально», одна версия затрёт другую. Виртуальное окружение решает это раз и навсегда: у каждого проекта свой набор зависимостей нужных версий. Это первое, что делает любой профессиональный Python-разработчик, заходя в новый проект.
Создаётся окружение модулем venv из стандартной библиотеки, активируется, и уже внутрь ставится Flask через pip. После активации в начале строки терминала появляется имя окружения в скобках — признак, что ты внутри песочницы.
python3 -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install Flask
pip freeze > requirements.txt
Файл requirements.txt фиксирует точные версии — по нему любой другой человек (или сервер) воспроизведёт то же окружение командой pip install -r requirements.txt. Это договор о зависимостях проекта.
Теперь минимальное приложение. Создай файл app.py:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
return "Привет, Flask!"
И запусти сервер разработки:
flask --app app run --debug
Открой в браузере http://127.0.0.1:5000 — увидишь приветствие. Флаг --debug включает автоперезагрузку при изменении кода и подробную страницу ошибок. В продакшене его держать нельзя — это дыра в безопасности.
Стоит сразу выработать привычку: новый проект начинается не с кода, а с окружения и репозитория. Создал папку, поднял venv, активировал, поставил Flask, зафиксировал requirements, добавил venv в .gitignore — и только потом пишешь app.py. Это пять минут, которые избавляют от часов разбирательств с конфликтами версий позже. Отдельно про флаг --debug: он не только показывает удобный трейсбек при ошибке, но и перезагружает сервер при каждом сохранении файла, поэтому в разработке его держат включённым, а в продакшене — категорически выключенным, иначе любой посетитель сможет открыть интерактивную консоль и выполнить код на твоём сервере.
Как работает под капотом
Что происходит за командой flask run, по шагам:
flask run
│
▼
найти объект Flask (app) в указанном модуле
│
▼
поднять встроенный WSGI-сервер на 127.0.0.1:5000
│
▼
ждать запросы ──▶ на каждый: маршрут → view → ответ
Строка app = Flask(__name__) создаёт объект приложения. Аргумент __name__ подсказывает Flask, где искать шаблоны и статику относительно текущего модуля. Декоратор @app.route("/") регистрирует функцию index как обработчик корневого URL. Когда придёт запрос на «/», Flask вызовет index и превратит возвращённую строку в HTTP-ответ.
Смоделируем «реестр маршрутов» из декоратора обычным Python, чтобы увидеть механику регистрации:
registry = {}
def route(path):
def decorator(func):
registry[path] = func
return func
return decorator
@route("/")
def index():
return "Главная"
@route("/help")
def help_page():
return "Помощь"
# имитируем входящий запрос
for path in ["/", "/help", "/none"]:
handler = registry.get(path)
print(path, "->", handler() if handler else "404")
Это ровно то, что делает @app.route внутри: кладёт функцию в таблицу маршрутов по ключу-пути. Запусти и убедись.
Частые ошибки
- Забыть активировать окружение. Тогда pip ставит пакеты глобально. Проверь скобки
(venv)в начале строки терминала. - Коммитить папку venv в git. Её добавляют в .gitignore — окружение пересоздаётся из requirements.txt.
- Оставить --debug в продакшене. Дебаг-консоль позволяет выполнять произвольный код у тебя на сервере.
Best practices
- Одно окружение на проект, всегда в .gitignore.
- Фиксируй версии в requirements.txt и обновляй осознанно.
- Используй переменную окружения FLASK_APP или флаг --app, не хардкодь запуск внутри кода без
if __name__.
Что запомнить
- Виртуальное окружение изолирует зависимости каждого проекта.
- requirements.txt фиксирует версии для воспроизведения окружения.
- flask run поднимает встроенный сервер разработки на 127.0.0.1:5000.
- Флаг --debug удобен в разработке и опасен в продакшене.
Итог: окружение изолирует зависимости, requirements фиксирует версии, а flask run поднимает сервер разработки. Каркас готов — пора понять, как Flask связывает URL с кодом.