Перейти к основному содержимому

Первая программа на Flask

Разработчику Архитектору

Play ITЗагрузка интерактивного демо…


Первая программа на Flask

Где применяют Flask

Flask — лёгкий каркас для веба на Python — маршруты, request/response, шаблоны Jinja2. Админку и ORM, как в Django, подключают отдельно.

Для первого сайта часто быстрее: один app.py — и страница в браузере.

Два уровня в этой статье:

  1. Список задач в памяти — HTML + JSON API.
  2. SQLite + Flask-SQLAlchemy — данные после перезапуска.

Обзор: Flask. Шпаргалка: Справочник по Flask.


Словарь

ТерминПростыми словами
Маршрут (route)URL + метод HTTP → функция Python
requestВходящий запрос: форма, JSON, cookies
render_templateHTML из templates/ + переменные
jsonifyОтвет в JSON
redirect"Открой другой URL" (302)
ORMКлассы Python ↔ таблицы БД
db.sessionИзменения до commit()

Что получится

URLДействие
/страница со списком и формой
POST /addдобавить задачу
GET/POST /api/tasksJSON 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.addcommitTask.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 + SQLAlchemyDjango
Модельdb.Modelmodels.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Только локально

Что попробовать

  1. с get_or_404.
DELETE /api/tasks/<id>

Разбор фрагмента:

  • это схема HTTP-эндпоинта для удаления сущности по идентификатору.
  • В API такое действие обычно возвращает 204 No Content при успешном удалении.
  1. Blueprint с префиксом /api.
  2. Сравнить с DRF и FastAPI.

Дальше

ЗадачаМатериал
ВалидацияFlask-WTF
СтруктураApplication Factory
ДеплойВеб-разработка и REST API на Python
ТестыТестирование на pytest

Как развивать учебный Flask-проект дальше

После первой версии полезно сделать три инженерных шага:

  1. вынести маршруты в Blueprint (/api отдельно от HTML);
  2. добавить слой сервисов между route и ORM;
  3. подключить 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.