Урок 4: HTTP-методы (GET и POST) и HTML-формы
Вступление: От монолога к диалогу
До сегодняшнего дня наши веб-приложения работали в режиме "Телевизора". Пользователь мог только смотреть на то, что мы ему показываем. Он не мог повлиять на содержание.
Сегодня мы переходим к режиму "Телефон". Мы научим сайт слышать пользователя и отвечать ему.
Цель урока
Понять, как передавать данные от браузера к серверу, изучить HTML-формы и разобраться в двух главных глаголах интернета: GET и POST.
Часть 1: Два способа общения (GET и POST)

Протокол HTTP (язык, на котором общаются браузер и сервер) имеет разные методы передачи информации. Самые важные для нас — это GET и POST. Разберем их на почтовой аналогии.
- Смысл: "Сервер, ДАЙ мне информацию".
- Аналогия: Почтовая открытка.
- Как работает: Вы пишете адрес и, возможно, короткую приписку. Все, что вы написали, видно почтальону и всем вокруг.
- В браузере: Когда вы ищете что-то в Google, ваш запрос виден в адресной строке (
google.com/search?q=котики). - Минус: Нельзя передавать пароли (все увидят). Ограничен объем данных.
Часть 2: HTML-формы — Пульт управления
Чтобы пользователь мог отправить данные методом POST, нам нужен специальный инструмент в HTML — Форма. Тег <form> работает как контейнер. Внутри него лежат поля ввода (input) и кнопка отправки.
Анатомия формы:
<form method="POST">
<label>Ваше имя:</label>
<input type="text" name="username">
<label>Пароль:</label>
<input type="password" name="user_pass">
<button type="submit">Отправить</button>
</form>Критически важный атрибут: name
Обратите внимание на name="username". Это самая важная часть.
- Представьте, что
name— это наклейка на коробке с вещами. - Если вы отправите коробку без наклейки, сервер (Flask) получит её, повертит в руках, не поймет, что это, и выбросит.
- Без атрибута
nameданные до Python не дойдут.
Часть 3: Прием данных во Flask (Объект Request)

Во Flask есть специальный глобальный объект — request (запрос). В тот момент, когда пользователь нажимает кнопку "Отправить", Flask ловит все летящие данные и складывает их в request.
Данные из формы попадают в специальный словарь: request.form.
Как извлечь данные в Python:
В HTML мы писали: <input name="username">. В Python мы пишем:
# Мы импортируем request из flask
from flask import request
# Достаем данные по ключу (имени)
name = request.form.get("username")
password = request.form.get("user_pass")Часть 4: Настройка Маршрутов (Разрешение на вход)
По умолчанию Flask очень осторожен. Его маршруты (@app.route) работают только на "посмотреть" (GET).
Ошибка 405 Method Not Allowed
Если вы попробуете отправить ему форму (POST), он выдаст ошибку 405 Method Not Allowed (Метод не разрешен). Ошибка 405 означает, что вы забыли добавить methods=["POST"].
Мы должны явно выдать разрешение в коде:
# Разрешаем и просто заходить (GET), и отправлять данные (POST)
@app.route("/login", methods=["GET", "POST"])
def login_page():
# ... код функцииЧасть 5: Логика обработки (If/Else)
Обычно одна и та же ссылка (например, /contact) обрабатывает два сценария. Мы используем условие if, чтобы понять, что происходит.
Сценарий:
@app.route("/contact", methods=["GET", "POST"])
def contact():
# Если пришел конверт с данными (Нажали кнопку)
if request.method == "POST":
user_message = request.form.get("message")
# Тут мы можем сохранить сообщение в базу или отправить email
return "Спасибо! Мы получили ваше сообщение: " + user_message
# Если просто зашли на страницу (GET)
else:
# Показываем пустую форму
return render_template("contact_form.html")Итоги и Домашнее задание
Резюме урока:
- GET — это открытка (данные видны, для получения страниц).
- POST — это конверт (данные скрыты, для отправки форм).
- HTML Form — требует атрибут
nameу каждого поля ввода. - Flask Request — объект, хранящий присланные данные.
- Ошибка 405 — означает, что вы забыли добавить
methods=["POST"].
Домашнее задание: Умный Калькулятор
Создайте веб-приложение с формой.
- Пользователь вводит два числа и выбирает действие (плюс или умножить) через выпадающий список (
<select>). - Сервер считает результат и возвращает страницу с ответом: "Результат: 42".
- Используйте
if request.method == "POST"для разделения логики.