Aplikacja webowa w Pythonie – Flask – Obsługa błędów – #9
Obsługa błędów może się wydawać mało pasjonującym tematem, ale gdy nasza aplikacja wyjdzie w świat i typowy użytkownik po zrobieniu literówki w adresie zobaczy coś takiego:
… to raczej nie będzie zachwycony :) Warto więc pamiętać o szczegółach i w wolnej chwili utworzyć podstrony, które nieco udobruchają potencjalnego usera.
Flask, 404 i inne takie
Zacznijmy od tej najpowszechniejszej strony błędu, na którą pewnie sam trafiasz raz na jakiś czas, czyli od 404 Not Found. Warto wyświetlić na niej informację, że poszukiwana strona nie została odnaleziona. Do zdefiniowania odpowiedniego layoutu, będziemy potrzebowali dekoratora errorhandler(), który umieścimy w views.py:
1 2 3 |
@app.errorhandler(404) def not_found(error): return render_template('404.html') |
By strona wyświetliła się poprawnie, dodajmy jeszcze 404.html w folderze templates:
1 2 3 4 5 6 7 8 |
{% extends "base.html" %} {% block title %}404{% endblock %} {% block content %} <h2>Niestety strona nie została znaleziona :(</h2> <p> Może coś poszło nie tak? </p> {% endblock %} |
Uruchom stronę i sprawdź, czy po wpisaniu losowych znaków w url-u całość zadziała. Powinna :)
Kolejnym błędem, jaki rozpatrzymy będzie 500 Internal Server Error. Na początek spróbujmy go wywołać – uda nam się to zrobić dzięki zakomentowaniu jednej z linijek dotyczących pobierania danych z bazy danych.
Wejdź w views.py, znajdź routing dla /wszystkie-posty i zakomentuj powyższy wers. Teraz wejdź na podstronę Posty z bazy danych i…
Nie jest to 500. Dlaczego? Wciąż mamy włączone debugowanie. W run.py zostaw samo app.run(), czyli bez debug=True w nawiasach. Teraz powinno zadziałać i wyświetlić nam piękny błąd serwera. Jeżeli tak się stało, zaimplementujmy error handler również dla kodu 500:
1 2 3 |
@app.errorhandler(500) def internal_error(error): return render_template('500.html') |
I dodajmy odpowiedni template:
1 2 3 4 5 6 7 8 |
{% extends "base.html" %} {% block title %}500{% endblock %} {% block content %} <h2>Niestety wystąpił błąd serwera :(</h2> <p> Może coś poszło nie tak? </p> {% endblock %} |
Tak, jak mogłeś zauważyć wcześniej, gdy mamy włączone debugowanie, błąd się nie wyświetla, dlatego podstrona nie będzie hiper-przydatna dla nas jako developerów. W przyszłości jednak, gdy nasza apka wypłynie na szeroki przestwór oceanu i będą z niej korzystać prawdziwi użytkownicy, na pewno się przyda :)
Jakie jeszcze handlery mogłyby się przydać? Na pewno 403 Forbidden i 400 Bad request. Ten pierwszy związany jest z nieuprawnionym dostępem do zablokowanych plików, a drugi z niepoprawnie przesłanymi danymi z formularza (np. gdy umieścimy w routingu odwołanie request.form["action"], a pole action nie istnieje). Skrypty dla nich będą wyglądać identycznie jak dla 400, tylko z wykorzystaniem odpowiednich kodów i layoutów.