Topic 4 of 6

Course materials are currently available in Russian only.

Формы и запросы

Сайт оживает, когда посетитель может что-то отправить: заполнить форму, ввести поисковый запрос. Данные приходят в объекте request.

GET и POST

Браузер открывает страницы методом GET, а формы с method="post" отправляет методом POST. По умолчанию маршрут принимает только GET — остальные получат 405. Разрешить POST:

from flask import request


@app.route("/contact", methods=["GET", "POST"])
def contact():
    if request.method == "POST":
        name = request.form.get("name", "")
        return f"Спасибо, {name}!"
    return '<form method="post"><input name="name"><button>OK</button></form>'
  • request.method — "GET" или "POST";
  • request.form — поля формы (как словарь); ключи — атрибуты name у полей;
  • request.form["name"] упадёт с ошибкой 400, если поля нет, а .get("name", "") вернёт запасное значение.

Параметры в адресе

Всё после ? — параметры запроса: /search?q=flask&page=2.

q = request.args.get("q", "")
page = request.args.get("page", 1, type=int)

С type=int Flask сам превращает строку в число, а если не получилось (page=abc) — тихо возвращает значение по умолчанию. int(request.args["page"]) в той же ситуации уронил бы сервер с ошибкой 500.

Проверка данных

Никогда не доверяйте данным из формы: поле может быть пустым, из одних пробелов, слишком длинным или содержать HTML. Сначала strip(), потом проверки, а при ошибке — понятный ответ с кодом 400:

errors = []
if not form.get("name", "").strip():
    errors.append("Укажите имя")
if errors:
    return "; ".join(errors), 400

Выводите полученные данные только через шаблон (или escape из markupsafe) — так HTML из формы не выполнится.

Перенаправление

После успешного POST хорошее приложение не показывает страницу сразу, а перенаправляет:

from flask import redirect, url_for

REVIEWS.append(text)
return redirect(url_for("reviews"))   # код 302 и заголовок Location: /reviews

Браузер сам откроет новый адрес методом GET. Теперь F5 просто обновит список, а не отправит отзыв второй раз. Это схема Post/Redirect/Get.

url_for("имя_функции", аргументы…) строит адрес по имени представления: url_for("post", pid=5) → /post/5.

Итог

  • methods=["GET", "POST"], request.method;
  • request.form.get(...) — поля формы, request.args.get(..., type=int) — параметры адреса;
  • strip() и проверки, ошибки — с кодом 400;
  • redirect(url_for(...)) после успешной отправки.