Глава 22 · Проект: список задач

Итоговый проект: список задач на Flask и SQLite

Тот же список задач, с которого началась глава, — теперь с постоянным хранением, JSON API и проверкой ввода.

Всё, что разбирали разделы 22.7-22.34, сходится в одном рабочем приложении — том же списке задач, с которого началась глава, теперь с постоянным хранением в SQLite.

projects/flask/todo-app/app.py

ФайлРоль
app.pyМаршруты, работа с базой данных, API
schema.sqlСтруктура таблицы tasks
templates/base.htmlОбщий каркас страницы, включая сообщения flash()
templates/index.htmlСписок задач, форма добавления
templates/privet.htmlИсторическая страница приветствия из раздела 22.5
templates/404.htmlСтраница «не найдено»
static/style.cssСобственные стили, без внешних CDN

Что умеет готовое приложение

Пять возможностей одного маленького приложения
Список задач
GET / — показывает все задачи
Пустое состояние, если задач нет
Добавление
POST /dobavit
Проверка ввода (раздел 22.31)
POST-Redirect-GET (раздел 22.13)
Отметка выполнения
POST /vypolnit/
Переключает done между 0 и 1
Удаление
POST /udalit/
Полностью убирает строку из базы
JSON API
GET /api/tasks — список
POST /api/tasks — добавление с JSON-телом
Итоговый список задач в браузере: две выполненные (зачёркнутые) задачи вверху и две ещё не выполненные ниже, поле добавления и кнопка «Поздороваться» снизу
Локально запущенное Flask-приложение в браузере — итоговый вид проекта: выполненные и невыполненные задачи, форма добавления и ссылка на историческую страницу /privet/<имя> из раздела 22.5.
Удаление и отметка выполнения — тоже POST, не GET
Раздел 22.9 уже объяснял: GET не должен менять состояние на сервере, потому что браузер может повторить его без предупреждения — например, при обновлении страницы. Поэтому у кнопок «Выполнено» и «Удалить» в шаблоне — собственные маленькие формы с method="post", а не простые ссылки <a href="/udalit/…">.

Запуск

terminal.txt
cd projects/flask/todo-app
python app.py

Первый запуск сам создаёт файл базы данных и таблицу — отдельная команда для этого не нужна. Откройте http://127.0.0.1:5000/: добавьте задачу, отметьте её выполненной, удалите, обновите страницу посреди процесса, перезапустите сам процесс и убедитесь, что список остался прежним.

Приложение работает и на узких экранах: раскладка CSS (раздел 22.3) перестраивается под мобильную ширину без горизонтальной прокрутки страницы.

★★ Самостоятельная задача
Счётчик оставшихся задач

Добавьте в index.html строку с числом невыполненных задач — {{ zadachi|selectattr('done', 'equalto', 0)|list|length }}.

★★★ Задача повышенной сложности
Сортировка по статусу

Измените запрос в glavnaya(), чтобы невыполненные задачи всегда показывались раньше выполненных — ORDER BY done, id.

Практика: работаем с готовым проектом
Модуль flask не установлен в браузерном окружении Pyodide — выполните локально в VS Code, PyCharm или Jupyter
Практика выполняется локально
Открыть практику →