Первая программа на Flask
Play ITЗагрузка интерактивного демо…
Первая программа на Flask
Где применяют Flask
Flask — лёгкий каркас для веба на Python — маршруты, request/response, шаблоны Jinja2. Админку и ORM, как в Django, подключают отдельно.
Для первого сайта часто быстрее: один app.py — и страница в браузере.
Два уровня в этой статье:
- Список задач в памяти — HTML + JSON API.
- SQLite + Flask-SQLAlchemy — данные после перезапуска.
Обзор: Flask. Шпаргалка: Справочник по Flask.
Словарь
| Термин | Простыми словами |
|---|---|
| Маршрут (route) | URL + метод HTTP → функция Python |
| request | Входящий запрос: форма, JSON, cookies |
| render_template | HTML из templates/ + переменные |
| jsonify | Ответ в JSON |
| redirect | "Открой другой URL" (302) |
| ORM | Классы Python ↔ таблицы БД |
| db.session | Изменения до commit() |
Что получится
| URL | Действие |
|---|---|
/ | страница со списком и формой |
POST /add | добавить задачу |
GET/POST /api/tasks | JSON API |
| после части 2 | те же URL, файл tasks.db |
Часть 1. Подготовка и приложение в памяти
python -m venv venv
# Windows — venv\Scripts\activate
# macOS/Linux — source venv/bin/activate
pip install flask
mkdir flask-todo && cd flask-todo
mkdir templates
Разбор фрагмента:
python -m venv venvсоздаёт изолированное окружение зависимостей.- Команда активации подключает это окружение в текущей сессии терминала.
pip install flaskставит веб-фреймворк для проекта.mkdir ...создаёт минимальную структуру каталога и папку для HTML-шаблонов.
flask-todo/
app.py
templates/
index.html
Разбор фрагмента:
app.pyсодержит Python-код приложения и маршрутов.templates/index.htmlрендерится Jinja2 как главная страница.- Такая структура соответствует стандартным ожиданиям Flask по путям.
app.py
Код ITЗагрузка примера кода…
Разбор по блокам
| Код | Что делает |
|---|---|
Flask(__name__) | Приложение; поиск templates/ |
tasks | Список в RAM — пропадёт после рестарта |
@app.get("/") | GET → HTML |
render_template(..., tasks=tasks) | Передать список в Jinja2 |
@app.post("/add") | Форма с главной |
request.form.get("title") | Поле <input name="title"> |
redirect(url_for("index")) | После POST на главную |
request.get_json(silent=True) | JSON в API |
return jsonify(...), 201 | Создано |
SECRET_KEY — для сессий и CSRF (Flask-WTF). В production — из окружения.
Запуск:
python app.py
http://127.0.0.1:5000/
Разбор фрагмента:
python app.pyподнимает встроенный сервер Flask в режиме разработки.- URL
http://127.0.0.1:5000/открывает локально запущенное приложение в браузере.
templates/index.html
Код ITЗагрузка примера кода…
| Синтаксис | Назначение |
|---|---|
{{ t.title }} | Вывод (с экранированием) |
{% for %} | Цикл |
{{ url_for('add') }} | URL функции add |
Проверка API
curl http://127.0.0.1:5000/api/tasks
curl -X POST http://127.0.0.1:5000/api/tasks \
-H "Content-Type: application/json" \
-d "{\"title\": \"Изучить Flask\"}"
Разбор фрагмента:
- Первый запрос проверяет список задач через
GET /api/tasks. - Второй отправляет JSON в
POST /api/tasksи создаёт новую задачу. - Заголовок
Content-Type: application/jsonобязателен для корректного чтения тела сервером.
Часть 2. SQLite и Flask-SQLAlchemy
Список tasks исчезает после перезапуска. SQLite — файл tasks.db. ORM — класс Task ↔ таблица.
pip install flask-sqlalchemy flask-migrate
Разбор фрагмента:
flask-sqlalchemyподключает ORM-слой SQLAlchemy к Flask.flask-migrateдобавляет инфраструктуру миграций схемы БД на базе Alembic.
Цикл: db.session.add → commit → Task.query.all().
Код ITЗагрузка примера кода…
В шаблоне по-прежнему {{ t.title }} — у модели те же атрибуты.
Миграции
flask db init
flask db migrate -m "create tasks"
flask db upgrade
Разбор фрагмента:
flask db initинициализирует каталог миграций проекта.flask db migrate ...генерирует новую миграцию из изменений моделей.flask db upgradeприменяет миграции и синхронизирует схему базы.
tasks.db — в .gitignore.
Как это связано с Django
| Flask + SQLAlchemy | Django | |
|---|---|---|
| Модель | db.Model | models.Model |
| Запрос | Task.query.all() | Task.objects.all() |
| Миграции | Flask-Migrate | встроенные |
| Админка | нет | есть |
Админка — Django 3011. Только API — FastAPI, DRF.
Частые ошибки
| Симптом | Причина |
|---|---|
Address already in use | Порт 5000 занят — port=5001 |
no such table | Нет create_all / flask db upgrade |
| Пустой JSON | Нет Content-Type: application/json |
debug=True в production | Только локально |
Что попробовать
- с
get_or_404.
DELETE /api/tasks/<id>
Разбор фрагмента:
- это схема HTTP-эндпоинта для удаления сущности по идентификатору.
- В API такое действие обычно возвращает
204 No Contentпри успешном удалении.
Дальше
| Задача | Материал |
|---|---|
| Валидация | Flask-WTF |
| Структура | Application Factory |
| Деплой | Веб-разработка и REST API на Python |
| Тесты | Тестирование на pytest |
Как развивать учебный Flask-проект дальше
После первой версии полезно сделать три инженерных шага:
- вынести маршруты в Blueprint (
/apiотдельно от HTML); - добавить слой сервисов между route и ORM;
- подключить pytest и тестовый клиент Flask.
Так вы получите структуру, которая масштабируется без переписывания всего проекта.
Мини-чек-лист production-готовности
DEBUG=Falseи секреты из окружения;- миграции применяются командой
flask db upgrade; - ошибки API имеют единый JSON-формат;
- есть health-check эндпоинт для мониторинга;
- логи содержат метод, путь, код ответа и время обработки.
Держите app.py коротким: модели в models.py, маршруты в routes/.
Базовый разбор HTTP и HTTPS находится в отдельной статье — HTTP как основа веб-интеграций.
В подборках
Статья входит в тематические подборки и блок "С чего начать?" на главной. Соседние шаги того же маршрута:
Первые шаги (маршрут подборки) — Первая программа на PyQt6, Первая программа на FastAPI, Первая программа на Tkinter, Первая программа на JavaServer Faces, Первая программа на Django REST Framework, Первая программа на JavaBean.