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

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

Разработчику Архитектору
Загрузка симулятора первой программы…

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

Flask — микрофреймворк: он даёт маршрутизацию и HTTP-слой, а базу данных, формы и авторизацию вы подключаете сами. В этом материале поднимаем приложение «Список задач»: HTML-страница, форма добавления и простой JSON API.

Обзор фреймворка: Flask. Шпаргалка: Справочник по Flask. Сравнение с Django: Django.


Подготовка окружения

python -m venv venv
# Windows:
venv\Scripts\activate
# macOS / Linux:
source venv/bin/activate

pip install flask
mkdir flask-todo && cd flask-todo

Структура проекта на старте:

flask-todo/
app.py
templates/
index.html

Минимальное приложение

Файл app.py:

from flask import Flask, render_template, request, redirect, url_for, jsonify

app = Flask(__name__)
app.config["SECRET_KEY"] = "dev-only-change-in-production"

tasks: list[dict] = []
_next_id = 1


def add_task(title: str) -> dict:
global _next_id
item = {"id": _next_id, "title": title.strip(), "done": False}
_next_id += 1
tasks.append(item)
return item


@app.get("/")
def index():
return render_template("index.html", tasks=tasks)


@app.post("/add")
def add():
title = request.form.get("title", "")
if title.strip():
add_task(title)
return redirect(url_for("index"))


@app.get("/api/tasks")
def api_list():
return jsonify(tasks)


@app.post("/api/tasks")
def api_create():
data = request.get_json(silent=True) or {}
title = str(data.get("title", "")).strip()
if not title:
return jsonify({"error": "title required"}), 400
return jsonify(add_task(title)), 201


if __name__ == "__main__":
app.run(debug=True)

Запуск:

python app.py

Откройте http://127.0.0.1:5000/.


Шаблон

templates/index.html:

<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>Flask — задачи</title>
</head>
<body>
<h1>Мои задачи</h1>
<form method="post" action="{{ url_for('add') }}">
<input name="title" placeholder="Новая задача" required>
<button type="submit">Добавить</button>
</form>
<ul>
{% for t in tasks %}
<li>{{ t.title }}</li>
{% else %}
<li>Пока пусто</li>
{% endfor %}
</ul>
</body>
</html>

Flask использует Jinja2: {% %} — логика, {{ }} — вывод.


Проверка 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\"}"

Следующие шаги

ЗадачаРасширение
Постоянное хранениеFlask-SQLAlchemy + SQLite
Валидация формFlask-WTF
Структура проектаApplication Factory и blueprints
ДеплойGunicorn + Nginx; см. Веб-разработка и REST API на Python

Совет
Режим debug=True удобен только локально: при ошибке показывается интерактивная консоль — в production его отключают.


См. также

Другие статьи этого же раздела в боковом меню (как на странице «О разделе»).