Формы и запросы
Сайт оживает, когда посетитель может что-то отправить: заполнить форму, ввести поисковый запрос. Данные приходят в объекте 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(...))после успешной отправки.