Что такое 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. Всё остальное докручивается расширениями, которые вы выбираете под задачу — и это скорее преимущество, чем недостаток: в вашем проекте окажется ровно то, что вы туда положили.
| Flask | Django | |
|---|---|---|
| Философия | минимум магии, стек собираете сами | всё включено, решения приняты за вас |
| База данных | по желанию, обычно SQLAlchemy | ORM в комплекте |
| Админка | нет | есть из коробки |
| Порог входа | низкий: 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) $ 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 ставятся Werkzeug (WSGI-инструменты), Jinja2 (шаблоны), Click (командная строка), itsdangerous (подписи, понадобятся для сессий), blinker и MarkupSafe. Вот и весь Flask — шесть зависимостей. Для сравнения: у Django их несколько десятков. Проверить версию можно одной командой:
(venv) $ python -c "import flask; print(flask.__version__)"
3.0.3
Как создать первое приложение на Flask?
Первый hello world на Flask: 7 строк
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
Запустите файл командой python app.py — сервер поднимется на адресе http://127.0.0.1:5000. Откройте его в браузере: увидите приветствие. Семь строк, и у вас работает сайт. Адрес 127.0.0.1 — это «домашний» адрес вашего компьютера: сервер виден только вам, наружу он не торчит. Число 5000 — порт, как номер квартиры в доме.
Строка app.run() в файле — способ для разработки. Более правильный запуск — через командную строку самого 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
Что увидит сам HTTP — можно проверить утилитой curl, она отправляет запрос и печатает ответ целиком, вместе с заголовками:
$ 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, мир!
Вот и весь веб в одном экране: статус 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. Этот код настоящий и запускается прямо на странице:
# Таблица маршрутов: путь -> функция
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)
Папки 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"))
1. Что входит в ядро Flask «из коробки»?
2. На каком адресе по умолчанию поднимается сервер разработки Flask?
3. Зачем в app = Flask(__name__) передают __name__?
4. Какие пакеты ставятся вместе с pip install flask?
5. Какая команда запускает приложение через CLI Flask?
Соберите мини-роутер для сайта кофейни. Маршрут / должен возвращать строку «Добро пожаловать в Кофейню на углу», маршрут /menu — «Меню: эспрессо, раф, круассан». Функция handle_request(path) для неизвестного пути возвращает «404: страница не найдена». Проверьте все три адреса.
Что такое 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-канал или свой блог — так о проекте узнают новые читатели.
Что читать дальше
Flask · Урок 2
Первое веб-приложение на Flask: маршруты и режим отладки
Второй урок курса Flask: несколько страниц в одном приложении, динамические маршруты /post/42, конвертеры типов, своя страница 404 и debug=True, который экономит перезапуски.
Flask · Урок 3
Шаблоны Jinja2: HTML-страницы с данными из Python
Третий урок курса Flask: шаблоны Jinja2 — переменные, циклы, фильтры и наследование base.html. Отличие этого урока: все примеры Jinja2 можно отрендерить прямо на странице.
Похожие уроки по темам
Подобраны автоматически по пересечению тем и ключевых слов.
FastAPI · Урок 2
Первое приложение на FastAPI: маршруты, uvicorn и Swagger
Устанавливаем FastAPI, пишем первый эндпоинт, запускаем сервер uvicorn и открываем Swagger — документацию, которая пишет себя сама.
fastapi для начинающихhello world fastapi
NumPy · Урок 1
Что такое NumPy и как установить через pip: первый массив ndarray
Первый массив ndarray: создаём, сравниваем со списком, разбираем dtype и shape — и ускоряем сумму миллиона чисел примерно в сто раз.
numpy для начинающихчто такое numpy
Flask · Урок 10
Проект: блог на Flask с постами и комментариями
Финальный проект курса: блог на Flask с постами, комментариями и пагинацией. Модели, CRUD-маршруты, наследование шаблонов, деплой на PythonAnywhere и разбор каждого решения.
блог на flaskпроект flask
Проверьте знания по Flask
В челлендже — 20 задач по Flask, по 2 из каждого урока этого раздела. Формат: фрагмент кода и четыре варианта — что напечатает. После ответа — вердикт и объяснение со ссылкой на урок-источник.
Тест по Flask: 20 задач