Глава 22 · Веб-разработка с Python

Flask в Python

Flask превращает программу на Python в веб-сервер — и делает это на удивление просто.

Flask в Python

Flask — это лёгкая библиотека, которая превращает программу на Python в веб-сервер: она принимает HTTP-запросы от браузера и отправляет в ответ HTML-страницы. Установка — как у любой библиотеки:

terminal.txt
pip install flask

Самое маленькое Flask-приложение

app_minimal.py
from flask import Flask

app = Flask(__name__)

@app.route("/")
def glavnaya():
    return "Привет, мир!"

if __name__ == "__main__":
    app.run(debug=True)
@app.route("/") — декоратор маршрута
Строчка над функцией — декоратор (глава 15 показывала похожую идею). @app.route("/") говорит Flask: «когда браузер запросит адрес /, вызови функцию glavnaya() и отправь то, что она вернёт».

Шаблоны — HTML с вставками Python

Возвращать HTML прямо строкой в Python неудобно. Flask использует движок шаблонов Jinja2 — обычный HTML-файл, куда можно вставлять python-подобные выражения в фигурных скобках {{ }}:

templates/index.html
<h1>Мой список задач</h1>
<ul>
  {% for zadacha in zadachi %}
    <li>{{ zadacha }}</li>
  {% endfor %}
</ul>
app.py
from flask import Flask, render_template

app = Flask(__name__)
zadachi = ["Выучить основы Python", "Собрать сайт на Flask"]

@app.route("/")
def glavnaya():
    return render_template("index.html", zadachi=zadachi)

Динамические адреса

Часть адреса можно превратить в параметр функции — Flask сам передаст в неё нужное значение из URL:

dinamicheskij_marshrut.py
@app.route("/privet/<imya>")
def privet(imya):
    return render_template("privet.html", imya=imya)
/privet/Сергей → imya = "Сергей"
Открыв в браузере адрес /privet/Сергей, вы получите в переменной imya строку "Сергей" — Flask сам достаёт эту часть из адреса.

Принимаем данные из формы

Чтобы пользователь мог что-то отправить на сервер (например, добавить задачу), используется HTML-форма и маршрут, принимающий метод POST:

dobavlenie.py
from flask import request, redirect, url_for

@app.route("/dobavit", methods=["POST"])
def dobavit():
    novaya_zadacha = request.form.get("zadacha", "").strip()
    if novaya_zadacha:
        zadachi.append(novaya_zadacha)
    return redirect(url_for("glavnaya"))

Полный проект

Всё вместе — маршруты, шаблоны, форма и статический CSS-файл — собрано в готовый мини-сайт «Список задач»:

📄 projects/flask/todo-app/app.py

Запустите сайт у себя
python app.py в терминале внутри projects/flask/todo-app/, затем откройте http://127.0.0.1:5000/ в браузере.
★★ Самостоятельная задача
Счётчик задач

Добавьте в index.html строку, показывающую общее количество задач: {{ zadachi|length }}.

★★★ Задача повышенной сложности
Удаление задачи

Добавьте маршрут /udalit/<int:indeks>, который удаляет задачу по её номеру в списке и делает редирект на главную.

Практика в Jupyter Notebook
22-05-flask.ipynb · маршруты, шаблоны и формы без запуска сервера
Открыть ноутбук →