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.
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
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ądarce | Program |
| Reakcja na nieprawidłowe dane | flash(...) 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 не может быть пустым"}} |
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.