Rozdział 22 · Tworzenie stron internetowych z Python

HTML-forms i przesyłanie danych do serwera

Od HTML- formy do zapisanych danych — i dlaczego po zapisaniu potrzebne jest jeszcze jedno zapytanie.

Rozdział 22.2 pokazał HTML- formularz, rozdział 22.5 — trasę, która go obsługuje. Teraz przeanalizujemy tę ścieżkę w całości, z jednym ważnym szczegółem: co robić po tego, jak formularz jest przetworzony.

templates/forma.html
<form action="{{ url_for('dobavit') }}" method="post">
  <label for="zadacha">Новая задача</label>
  <input type="text" id="zadacha" name="zadacha" required>
  <button type="submit">Добавить</button>
</form>

method="post" mówi przeglądarce o przesłaniu danych formularza jako treść żądania POST-, a nie jako część adresu. Atrybut name="zadacha" pole definiuje klucz, pod którym wartość dotrze na serwer.

app.py
@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"), code=303)

request.form.get("zadacha", "") odzyskuje wartość pola przez imię; drugi argument dotyczy tego, co zwrócić, jeśli nie było żadnego pola. Jakie inne sprawdzenia należy wykonać Dodaj przed zapisaniem wprowadzonej wartości – w sekcji 22.31.

POST-Redirect-GET — po co jest redirect na końcu

Obsługa formularza nie kończy się na renderowaniu strony, lecz na redirect(url_for("glavnaya"), code=303) – HTTP-odpowiedź z kodem 303 See Other (Rozdział 22.9), który informuje przeglądarkę o adres, z którego należy żądać wynik używając metody GET. Przeglądarka Yandex wykonuje drugie, teraz bezpieczne żądanie i pokazuje Page.

Przeglądarka
POST /dobavit
z danymi formularza
Flask
oszczędza zadanie
303 See Other, Location: /
Przeglądarka
GET /
już bez munduru
Flask
pokazuje lista
POST-Redirect-GET: dwa osobne zapytania zamiast jednego
Bez ponownego wysyłania redirect duplikatów danych
Jeśli obsługa żądań POST- natychmiast zwraca gotową stronę (zamiast redirect), przeglądarka kojarzy już wyświetloną stronę z tym POST- żądaniem, a odświeżenie strony (F5) ponownie przesła formularz, cicho duplikując zadanie. Redirect zapewnia, że po odpowiedzi serwera bieżąca operacja przeglądarki będzie bezpieczna GET którą można powtarzać dowolną liczbę razy.
Praktyka: forma i POST-Redirect-GET
Moduł flask nie jest zainstalowany w środowisku przeglądarki Pyodide – działa lokalnie w VS Code, PyCharm lub Jupyter
Praktyka kursuje lokalnie
Otwórz praktykę →