Rozdział 22 · Tworzenie stron internetowych z Python

Walidacja danych wejściowych i obsługa błędów

Formularz w przeglądarce to nie jedyny sposób wysłania żądania, dlatego weryfikacja na serwerze jest obowiązkowa.

Rozdział 22.4 pokazywała weryfikację formularza w przeglądarce za pomocą JavaScript. To jest przydatne dla użytkownik, ale nigdy jedyna linia obrony: żądanie może być wysłane bez żadnych przeglądarka — na przykład program, który bezpośrednio uzyskuje dostęp do /dobavit lub /api/tasks, bez żadnej linii JavaScript. Input Dane muszą być ponownie weryfikowane po stronie serwera w każdej trasie, którą akceptuje.

Nie ufaj opinii tylko dlatego, że pochodzi z twojej formy
Formularz HTML z sekcji 22.13 ustawia required oraz maxlength — ale to są tylko powiadomienia przeglądarkowe, a nie gwarancja. Nic nie stoi na przeszkodzie, by wysłać POST- żądanie do /dobavit bezpośrednio, omijając formę i wszelkie jej ograniczenia.

Sprawdzenie w projekcie rozdziału

app.py
MAX_TITLE_LENGTH = 200


def clean_title(raw_title):
    title = raw_title.strip()
    if not title or len(title) > MAX_TITLE_LENGTH:
        return None
    return title

strip() usuwa przypadkowe spacje na końcach (na przykład, jeśli użytkownik nacisnął spację, a następnie Enter). Pusta łańcuch znaków po tym i za długa łańcuch znaków — oba przypadki są uznawane za nieprawidłowe i zwracają None.

HTML-trasa i API-trasa reagują na błąd inaczej

HTML-form (/dobavit)API (/api/tasks)
Kto czyta odpowiedźCzłowiek w przeglądarceProgram
Reakcja na nieprawidłowe daneflash(...) z tekstem czytelnym i przekierowaniem z powrotem (sekcja 22.30)kod 400 i JSON ciało z opisem błędu
Przykładowa odpowiedźStrona z listą zadań i wiadomością z góry{{"error": "title не может быть пустым"}}
Lista zadań z różowym komunikatem na górze: „Nazwa zadania nie może być pusta i nie dłuższa niż 200 znaków.”
Prawdziwy efekt złożenia formularza tylko z odstępami: clean_title() zwrócił None, flash() pojawiła się wiadomość, przekierowanie wróciło na tę samą stronę, a zadanie nie zostało dodane.
app.py
data = request.get_json(silent=True)
if not isinstance(data, dict) or not isinstance(data.get("title"), str):
    return jsonify({{"error": „title pole musi i musi być łańcuch znaków za linią”}}), 400
title = clean_title(data["title"])
if title is None:
    return jsonify({{"error": „title nie może być pusty i nie dłuższy niż 200 znaków”}}), 400

404 — odwołanie do czegoś, czego nie ma

Jeśli spróbujesz oznaczyć jako wykonane lub usunąć zadanie nieistniejące idtrasa wzywa abort(404) — Flask natychmiast zwraca standardową stronę błędu (lub JSON dla ścieżek API-, sekcja 22.9), bez dalszego wykonywania kodu.

Praktyka: Zweryfikować dane wejściowe
interaktywny laptop bezpośrednio w przeglądarce – Python 3.14 przez Pyodide, bez instalacji
Otwórz praktykę →