flask
flaskЛекцияPython/Flask

Урок 4: HTTP-методы (GET и POST) и HTML-формы

👀 Загрузка...

Вступление: От монолога к диалогу

До сегодняшнего дня наши веб-приложения работали в режиме "Телевизора". Пользователь мог только смотреть на то, что мы ему показываем. Он не мог повлиять на содержание.

Сегодня мы переходим к режиму "Телефон". Мы научим сайт слышать пользователя и отвечать ему.

Цель урока

Понять, как передавать данные от браузера к серверу, изучить HTML-формы и разобраться в двух главных глаголах интернета: GET и POST.


Часть 1: Два способа общения (GET и POST)

Схема работы HTTP методов GET и POST на примере открытки и конверта
Схема работы HTTP методов 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)

Схема передачи данных из HTML формы в объект request Flask
Схема передачи данных из HTML формы в объект request Flask

Во 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")

Итоги и Домашнее задание

Резюме урока:

  1. GET — это открытка (данные видны, для получения страниц).
  2. POST — это конверт (данные скрыты, для отправки форм).
  3. HTML Form — требует атрибут name у каждого поля ввода.
  4. Flask Request — объект, хранящий присланные данные.
  5. Ошибка 405 — означает, что вы забыли добавить methods=["POST"].

Домашнее задание: Умный Калькулятор

Создайте веб-приложение с формой.

  1. Пользователь вводит два числа и выбирает действие (плюс или умножить) через выпадающий список (<select>).
  2. Сервер считает результат и возвращает страницу с ответом: "Результат: 42".
  3. Используйте if request.method == "POST" для разделения логики.

Проверь себя!

Какой атрибут в теге <input> критически важен для того, чтобы Flask мог получить и распознать отправленные данные из формы?

Для чего лучше всего подходит HTTP-метод POST?