Перейти к содержанию

172 уроков, 13 библиотек и челлендж «Что выведет код?» — бесплатно, код прямо в браузере

Начать обучение
Урок 1 из 20 Начальный 35 мин 100 XP

Что такое Flask: знакомство с микрофреймворком

Первый урок самоучителя Flask: как устроен веб, зачем нужен WSGI, чем микрофреймворк отличается от Django — и как за семь строк получить работающий сайт.

Редакция Питоники

Допустим, вы написали на Python скрипт, который подбирает скидки для товаров магазина. Скрипт лежит у вас на диске, запускаете его только вы, и чтобы показать результат коллеге, вы пересылаете ему CSV-файл в мессенджер. Так себе продукт. А теперь представьте другую картину: вы отдаёте коллеге ссылку, он открывает её в браузере — и видит страницу с товарами и ценами. Это и есть веб-приложение, и Flask — самый короткий путь от вашего скрипта до такой страницы.

В этом уроке разберём, что такое Flask и почему его так любят начинающие: как браузер разговаривает с сервером, зачем нужна аббревиатура WSGI, чем микрофреймворк отличается от Django. А в конце — напишем первый hello world: семь строк кода, и у вас работает сайт.

Как работает веб: запрос и ответ

Прежде чем писать код, стоит потратить две минуты на то, что вообще происходит, когда вы открываете сайт. Браузер отправляет серверу HTTP-запрос — по сути, вежливую просьбу: «дай мне содержимое страницы /menu». Сервер ищет подходящий обработчик, готовит ответ и возвращает его: статус, заголовки и тело — обычно HTML. Если HTML для вас пока тёмный лес, быстрый минимум есть в мини-словаре парсера из самоучителя BeautifulSoup.

  • Вы набираете в адресной строке http://127.0.0.1:5000/menu
  • Браузер отправляет GET-запрос на этот адрес
  • Flask смотрит в таблицу маршрутов и находит функцию, привязанную к /menu
  • Функция возвращает строку или HTML — это тело ответа
  • Браузер получает ответ со статусом 200 OK и рисует страницу

Статус-коды — язык, на котором сервер отвечает коротко и без лишних слов. 200 — всё хорошо, вот страница. 404 — такой страницы нет. 500 — сервер попытался, но упал с ошибкой. Вы будете видеть их постоянно, особенно 404, когда опечатаетесь в маршруте. К концу курса вы будете читать эти три числа, как читают надписи на приборной панели.

Зачем нужен фреймворк, если есть чистый Python

Технически сайт можно написать и без фреймворка: открыть сокет на порту 5000 и вручную разбирать HTTP-запросы. В учебных целях это даже полезно — один раз в жизни. Но в реальном проекте на вас обрушится рутина: разобрать запрос с заголовками и кодировками, найти нужную страницу, отдать правильные заголовки ответа, обработать форму, не сломаться на кириллице, закрыть дыры в безопасности. Фреймворк — это коробка с уже написанной рутиной, внутри которой вы занимаетесь только главным: что показывать и на каком адресе.

Чем микрофреймворк Flask отличается от Django

Flask называют микрофреймворком не потому, что он слабый. «Микро» — про ядро: в нём нет ORM, админки, авторизации и готовой валидации форм. Есть маршрутизация, механизм запрос-ответ и шаблоны на Jinja2. Всё остальное докручивается расширениями, которые вы выбираете под задачу — и это скорее преимущество, чем недостаток: в вашем проекте окажется ровно то, что вы туда положили.

FlaskDjango
Философияминимум магии, стек собираете самивсё включено, решения приняты за вас
База данныхпо желанию, обычно SQLAlchemyORM в комплекте
Админканетесть из коробки
Порог входанизкий: hello world в 7 строквыше: настройки, приложения, миграции
Где уместеннебольшие сайты, API, прототипыкрупные проекты со стандартным стеком

Моё правило простое: делаете сайт на 5–20 страниц, внутренний инструмент или небольшой API — берите Flask. Проект большой, команда из десяти человек, нужен готовый административный интерфейс — Django сэкономит недели. Новичку Flask даёт больше: вы своими руками соберёте то, что Django прячет под капотом, и поймёте, как на самом деле устроен веб.

Flask появился 1 апреля 2010 года как апрельская шутка Армина Ронахера: он собрал фреймворк из уже существующих библиотек Werkzeug и Jinja2 — почти ради забавы. Шутка оказалась настолько удачной, что сегодня на Flask работают Pinterest и тысячи внутренних инструментов по всему миру.

Flask для начинающих: установка за две минуты

Виртуальное окружение

Любой питонист рано или поздно ловит конфликт версий: одному проекту нужен старый пакет, другому — новый. Виртуальное окружение решает это раз и навсегда: у каждого проекта своя папка с собственными пакетами. Заведите привычку создавать venv перед первым pip install — сэкономите себе часы странной отладки.

Терминал: создаём окружение и активируем его
$ python3 -m venv venv
$ source venv/bin/activate
(venv) $
Команды терминала выполняются на вашем компьютере — в браузере не запустить. Приглашение (venv) означает, что окружение активно. На Windows: venv\Scripts\activate.
Терминал: устанавливаем Flask
(venv) $ pip install flask
Вывод
Collecting flask
  Downloading flask-3.0.3-py3-none-any.whl.metadata (3.2 kB)
Collecting Werkzeug>=3.0.0 (from flask)
  Downloading werkzeug-3.0.3-py3-none-any.whl.metadata (3.7 kB)
Collecting Jinja2>=3.1.2 (from flask)
  Downloading jinja2-3.1.4-py3-none-any.whl.metadata (3.2 kB)
...
Successfully installed blinker-1.8.2 click-8.1.7 flask-3.0.3 itsdangerous-2.2.0 jinja2-3.1.4 markupsafe-2.1.5 werkzeug-3.0.3
Вывод сокращён — главное в последней строке. Сервер в браузере не запустить — это реальный код Flask с ожидаемым результатом.

Посмотрите на список в последней строке: вместе с Flask ставятся Werkzeug (WSGI-инструменты), Jinja2 (шаблоны), Click (командная строка), itsdangerous (подписи, понадобятся для сессий), blinker и MarkupSafe. Вот и весь Flask — шесть зависимостей. Для сравнения: у Django их несколько десятков. Проверить версию можно одной командой:

Терминал: проверяем версию
(venv) $ python -c "import flask; print(flask.__version__)"
Вывод
3.0.3
Библиотека flask недоступна в браузерном интерпретаторе, поэтому команда приведена с ожидаемым выводом.

Как создать первое приложение на Flask?

Первый hello world на Flask: 7 строк

app.py — минимальное приложение
from flask import Flask

app = Flask(__name__)

@app.route("/")
def index():
    return "Hello, мир!"

if __name__ == "__main__":
    app.run()
Вывод
 * Serving Flask app 'app'
 * Debug mode: off
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
Сервер в браузере не запустить — это реальный код Flask с ожидаемым результатом: Flask-сервер слушает порт, а браузер не умеет. Лог выше печатает команда python app.py.

Запустите файл командой python app.py — сервер поднимется на адресе http://127.0.0.1:5000. Откройте его в браузере: увидите приветствие. Семь строк, и у вас работает сайт. Адрес 127.0.0.1 — это «домашний» адрес вашего компьютера: сервер виден только вам, наружу он не торчит. Число 5000 — порт, как номер квартиры в доме.

Строка app.run() в файле — способ для разработки. Более правильный запуск — через командную строку самого Flask:

Терминал: запуск через CLI Flask
(venv) $ flask --app app run
Вывод
 * Serving Flask app 'app'
 * Debug mode: off
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
Команда терминала. В уроке 2 включим режим отладки флагом --debug и увидим, как вывод изменится.

Что увидит сам HTTP — можно проверить утилитой curl, она отправляет запрос и печатает ответ целиком, вместе с заголовками:

Терминал: смотрим сырой HTTP-ответ
$ curl -i http://127.0.0.1:5000/
Вывод
HTTP/1.1 200 OK
Server: Werkzeug/3.0.3 Python/3.12.3
Content-Type: text/html; charset=utf-8
Content-Length: 14

Hello, мир!
Набор заголовков немного зависит от версий Werkzeug и Python; постоянны статус 200, Content-Type и тело ответа.

Вот и весь веб в одном экране: статус 200, тип содержимого text/html и тело — та самая строка, которую вернула функция index. Всё остальное, что вы будете изучать в курсе, — это вариации вокруг этих трёх элементов.

Что на самом деле делает app = Flask(__name__)

Строка app = Flask(__name__) выглядит как заклинание, но за ней стоит конкретика. __name__ — встроенная переменная Python, имя текущего модуля: когда вы запускаете файл напрямую, она равна "__main__". Flask использует её, чтобы понять, где вы находитесь, и найти соседние папки: templates для шаблонов и static для css и картинок. Передадите не то — Flask будет искать папки в чужом месте, и вы получите загадочную ошибку TemplateNotFound (познакомимся с ней в уроке про шаблоны Jinja2).

Сам объект app — центр вселенной приложения. Он хранит таблицу маршрутов, конфигурацию, через него регистрируются расширения. Все декораторы @app.route, о которых пойдёт речь в уроке 2, вешаются именно на этот объект.

WSGI простыми словами

Когда вы читаете про Flask, рядом всегда всплывает аббревиатура WSGI. Расшифровывается как Web Server Gateway Interface и означает простую договорённость: как именно сервер общается с Python-приложением. Приложение — это функция, которая принимает запрос и возвращает ответ. Кто её вызывает — встроенный сервер разработки, gunicorn или uWSGI — коду всё равно. Благодаря WSGI одно и то же Flask-приложение работает и в вашем ноутбуке, и на большом сервере.

Встроенный сервер, который мы запускали, медленный и служит только для разработки — не зря он печатает WARNING в каждой строке лога. В продакшене приложение запускают под WSGI-сервером gunicorn, а перед ним ставят nginx. Это тема финального, десятого урока. Пока держите в голове картинку цепочки: браузер → nginx → gunicorn → ваш код на Flask.

Мини-роутер своими руками: запустите прямо здесь

Чтобы почувствовать, как Flask находит функцию для адреса, соберём маршрутизацию сами — без сети и сервера, на чистом Python. Этот код настоящий и запускается прямо на странице:

Эмуляция маршрутизации Flask (можно запустить)
# Таблица маршрутов: путь -> функция
routes = {}

def route(path):
    # декоратор сохраняет функцию в таблицу маршрутов
    def decorator(func):
        routes[path] = func
        return func
    return decorator

@route("/")
def index():
    return "Главная страница кофейни"

@route("/menu")
def menu():
    return "Меню: эспрессо, капучино, раф"

def handle_request(path):
    # так запрос находит нужную функцию
    func = routes.get(path)
    if func is None:
        return "404 Not Found"
    return func()

print(handle_request("/"))
print(handle_request("/menu"))
print(handle_request("/cart"))
Вывод
Главная страница кофейни
Меню: эспрессо, капучино, раф
404 Not Found

Ровно это делает @app.route: записывает функцию в таблицу маршрутов при импорте файла. Разница в том, что настоящий Flask заодно разбирает заголовки, методы и кодировки, а также умеет в динамические адреса вида /post/42 — но идея та же самая, и вы её только что запустили.

Из чего состоит минимальный проект

Структура папки проекта
my_site/
  venv/              # виртуальное окружение - в git не попадает
  app.py             # само приложение
  requirements.txt   # список зависимостей
  templates/         # HTML-шаблоны (появятся в уроке 3)
  static/            # css, картинки, js (урок 7)
Пока существует только app.py — и этого достаточно. Папки Flask подхватит автоматически, как только вы их создадите рядом с app.py с точными именами.

Папки templates и static Flask найдёт сам — важно только их имя и расположение. Файл requirements.txt нужен, чтобы перенести окружение на другой компьютер или сервер: команда pip freeze > requirements.txt сохраняет список установленных пакетов, а pip install -r requirements.txt восстанавливает его.

Три ошибки, которые совершают все новички

Итоги урока и что дальше

Короткий чек-лист того, что вы теперь знаете: Flask — микрофреймворк, ядро которого — маршрутизация и механизм запрос-ответ; установка занимает две минуты через venv и pip; минимальное приложение — семь строк; WSGI — договорённость, по которой сервер вызывает вашу функцию с запросом и получает ответ. Не поленитесь запустить hello world локально: одна ошибка на старте, найденная сейчас, не испортит вам урок 2.

В следующем уроке сайты из одной страницы станет мало: добавим маршруты с параметрами вида /post/42, конвертеры типов, свою страницу 404 и режим отладки debug=True, который сам перезагружает код при изменениях. Весь курс собирает самоучитель Flask: десять уроков от hello world до блога с базой данных. Встречаемся на уроке 2 о маршрутах и первом приложении.

Что выведет код?

Сначала предскажи ответ в голове — это главный навык программиста.

routes = {}

def route(path):
    def decorator(func):
        routes[path] = func
        return func
    return decorator

@route("/health")
def health():
    return "OK"

print(routes["/health"]())
def handle_request(path):
    routes = {"/": "Главная", "/menu": "Меню"}
    return routes.get(path, "404 Not Found")

print(handle_request("/menu"))
print(handle_request("/cart"))
Проверь себя
0 / 5

1. Что входит в ядро Flask «из коробки»?

2. На каком адресе по умолчанию поднимается сервер разработки Flask?

3. Зачем в app = Flask(__name__) передают __name__?

4. Какие пакеты ставятся вместе с pip install flask?

5. Какая команда запускает приложение через CLI Flask?

Карточки терминов
Запомнено: 0 / 6
Практика

Соберите мини-роутер для сайта кофейни. Маршрут / должен возвращать строку «Добро пожаловать в Кофейню на углу», маршрут /menu — «Меню: эспрессо, раф, круассан». Функция handle_request(path) для неизвестного пути возвращает «404: страница не найдена». Проверьте все три адреса.

practice.py
Вопросы и ответы по уроку

Что такое Flask и зачем он нужен?

Flask — микрофреймворк для создания веб-приложений на Python. Он берёт на себя рутину HTTP: разбор запросов, маршрутизацию и шаблоны, оставляя вам бизнес-логику. Минимальный сайт на Flask занимает семь строк кода.

Чем Flask отличается от Django?

Django — «батарейки в комплекте»: ORM, админка и авторизация уже внутри, но и порог входа выше. Flask — минимальное ядро, стек собираете сами. Для обучения вебу и небольших проектов Flask проще, для больших командных проектов удобнее Django.

Flask или FastAPI — что выбрать новичку?

Если цель — классические сайты с HTML-страницами и формами, начните с Flask: шаблоны там понятнее. FastAPI силён в API и асинхронности, но требует знакомства с типизацией и async. Оба фреймворка отлично уживаются в одном резюме.

Подходит ли Flask для больших проектов?

Да, с оговорками. Крупные проекты на Flask строят через Blueprint'ы (модульную структуру), SQLAlchemy и расширения. Но при типовых задачах и большой команде Django часто экономит время за счёт готовых компонентов.

С чего начать изучение Flask: план обучения для новичка?

План из этого курса: урок 1 — первое приложение и маршруты, урок 2 — динамические параметры, урок 3 — шаблоны Jinja2 (рендерятся прямо в браузере), урок 4 — формы, урок 5 — база данных SQLite, дальше — сессии и вход по паролю, финал — блог на Blueprint'ах. Идите по порядку: каждый урок использует предыдущий, весь путь — один растущий проект, а не разрозненные примеры.

Какие зависимости ставятся вместе с pip install flask?

Вместе с Flask ставятся Werkzeug, Jinja2, Click, itsdangerous, blinker и MarkupSafe — шесть зависимостей. Каждая нужна ядру: Werkzeug — WSGI-инструменты, Jinja2 — шаблоны, Click — командная строка, itsdangerous — подписи для сессий. Для сравнения: у Django зависимостей несколько десятков.

Понравился урок? Сошлитесь на него

«Фреймворк — это коробка с уже написанной рутиной, внутри которой вы занимаетесь только главным: что показывать и на каком адресе.»

Скопируйте готовую ссылку в формате HTML, Markdown или чистый адрес и вставьте в статью на Habr, VC, Telegram-канал или свой блог — так о проекте узнают новые читатели.

TelegramVK

Похожие уроки по темам

Подобраны автоматически по пересечению тем и ключевых слов.

Проверьте знания по Flask

В челлендже — 20 задач по Flask, по 2 из каждого урока этого раздела. Формат: фрагмент кода и четыре варианта — что напечатает. После ответа — вердикт и объяснение со ссылкой на урок-источник.

Тест по Flask: 20 задач