Lekce 6 - Zobrazení zpráv a vlastní 404 stránka ve Flask
V minulé lekci, Přihlášení uživatelů ve Flask, jsme si vytvořili přihlašovací formulář a
jméno aktuálně přihlášeného uživatele jsme ukládali do
session
. Také jsme si aplikaci rozdělili na jednotlivé
moduly.
V dnešním Python Flask tutoriálu si ukážeme, jak uživateli zobrazit informační zprávu s kategorií, a vytvoříme si vlastní stránku, která se zobrazí pokud nastane chyba 404.
Vlastní 404 stránka
Nejdříve si vytvoříme šablonu, která se bude zobrazovat, když nastane
chyba 404. Tedy v případě, když uživatel vyžádá URL adresu, která v
naší aplikaci neexistuje. Stáhněte si obrázek níže, nebo použijte
kterýkoli jiný, a uložte jej do složky /projekt/root/static/
jako sad_panda.jpg
:
Nejdříve si vytvoříme funkci v souboru
root/error_handlers.py
, která nám bude vracet šablonu a status
404:
from flask import render_template def error_404(error): return render_template("404.html"), 404
Poté vytvoříme šablonu root/templates/404.html
, která se
bude zobrazovat uživateli:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <link rel="stylesheet" href="{{ url_for('static', filename='bootstrap-4.1.3-dist/css/bootstrap.min.css')}}"> <style> html, body { height: 100%; } </style> </head> <body> <div class="jumbotron" style="min-height: 100%; height: 100%; display: flex; align-items: center;"> <div class="container-fluid col-2 text-center align-middle"> <img src="{{ url_for('static', filename='sad_panda.jpg') }}" style="max-width: 100%; border-radius: 100%;"> Jejda, tato stránka neexistuje. <hr> <a href="{{ url_for('homepage') }}"><button class="btn btn-outline-primary btn-block">Zpět na homepage</button></a> </div> </div> </body> </html>
Jak jste si jistě všimli, tato šablona odkazuje na url
homepage
, která neexistuje. Proto přejmenujeme funkci
kalkulacka()
v modulu projekt/root/__init__.py
na
homepage()
a přesměrujeme uživatele:
@app.route("/") def homepage(): return redirect(url_for("galerie_page.galerie"))
Naši funkci, která vrací chybovou stránku, musíme zaregistrovat v
souboru root/__init__.py
:
from flask import Flask, redirect, url_for from root.galerie.galerie import galerie_page from root.login.login import login_page from root.error_handlers import error_404 app = Flask(__name__) # Musíme nastavit SECRET_KEY, pokud chceme používat CSRF app.config["SECRET_KEY"] = "super tajny klic" app.register_blueprint(galerie_page) app.register_blueprint(login_page) app.register_error_handler(404, error_404) # Nastavíme složku, kam se budou obrázky ukládat UPLOAD_FOLDER = app.static_folder + "/uploads/" app.config["UPLOAD_FOLDER"] = UPLOAD_FOLDER @app.route("/") def homepage(): return redirect(url_for("galerie_page.galerie"))
Stránka vypadá následovně:
Flash zprávy
Flash zprávy slouží pro rychlé předání informace uživateli. Jelikož
na webu se na rozdíl od desktopových aplikací neustále přesouváme ze
stránky na stránku, je jinak těžké poznat, zda se akce opravdu zdařila.
Lidé jsou na podobnou komunikaci na webu zvyklí a flash zprávy jim pomáhají
v orientaci aplikací. My upozorníme našeho uživatele, když se úspěšně
přihlásí. Úpravu provedeme v modulu
složka projektu/root/login/login.py
:
from flask import flash @login_page.route("/login/", methods = ["GET", "POST"]) def login(): form = LoginForm() if form.validate_on_submit(): user = form.user.data password = form.password.data if password == "letmein": session["user"] = user flash("Byl jsi přihlášen jako {username}".format(username = user)) return render_template("login.html", form = form)
Nejdříve importujeme funkci flash()
, abychom mohli takovou
zprávu vytvořit. Po přihlášení vytvoříme zprávu o úspěšném
přihlášení. První parametr funkce je text zprávy a druhý nepovinný je
kategorie, což umožňuje zprávy kategorizovat jako např. úspěch, chyba,
informace, varování a podobně. Různé kategorie poté můžeme vykreslovat
uživateli např. jinak barevné nebo s jinými ikonami. Nejdříve ale
dokončíme příklad se zprávou bez speciální kategorie.
Upravíme si template složka projektu/root/templates/base.html
,
aby nám zobrazovala všechny flash zprávy.
Flash zpráv může být vytvořeno více najednou.
<!-- ostatní zůstává stejné --> <body> <header> {% block header %} {% set user = session["user"] %} Login - {% if user %} {{ user }} {% else %} Nejsi přihlášen {% endif %}<br> <a href = "{{ url_for('login_page.odhlasit') }}">Odhlásit</a> <br> {% set zpravy = get_flashed_messages() %} {% for zprava in zpravy %} {{ zprava }} {% endfor %} {% endblock %} </header> <div id="content"> {% block content %} {% endblock %} </div> <footer> {% block footer %} Prostý footer {% endblock %} </footer> </body> </html>
Namísto {% set zpravy = get_flashed_messages() %}
můžeme
použít i blok {% with zpravy = get_flashed_messages() %}
, který
musíme ukončit {% endwith %}
.
Nyní se nám po přihlášení zobrazí zpráva:
Nyní zprávě potvrzující přihlášení přiřadíme kategorii
"info"
. Po odhlášení také informuje uživatele zprávou s
kategorií "critical"
. Kategorie si můžete pojmenovat dle
libosti, ale název by měl být vždy smysluplný.
Úpravu přihlašovací zprávy provedeme v modulu
složka projektu/root/login/login.py
:
@login_page.route("/login/", methods = ["GET", "POST"]) def login(): form = LoginForm() if form.validate_on_submit(): user = form.user.data password = form.password.data if password == "letmein": session["user"] = user flash("Byl jsi přihlášen jako {username}".format(username = user), "info") return render_template("login.html", form = form)
Přidání odhlašovací zprávy provedeme v modulu
složka projektu/root/login/login.py
:
@login_page.route("/logout/", methods = ["GET", "POST"]) def odhlasit(): if "user" in session: flash("Uživatel {username} byl odhlášen".format(username = session["user"]), "critical") session.pop("user", None) return redirect(url_for("login_page.login"))
Nejdříve zkontrolujeme, zda byl uživatel vůbec přihlášen, aby odhlášení dávalo smysl, a poté zprávu vypíšeme.
Abychom mohli zprávy filtroval podle kategorie, musíme nastavit funkci
get_flashed_messages()
parametr with_categories=True
.
Kategorii následně získáme spolu se zprávou:
<!-- ostatní zůstává stejné --> <body> <header> {% block header %} {% set user = session["user"] %} Login - {% if user %} {{ user }} {% else %} Nejsi přihlášen {% endif %}<br> <a href = "{{ url_for('login_page.odhlasit') }}">Odhlásit</a> <br> {% set zpravy = get_flashed_messages(with_categories=True) %} {% for kategorie, zprava in zpravy %} {% if kategorie == "info" %} <span style="color: green;">{{ zprava }}</span> {% elif kategorie == "critical" %} <span style="color: red;">{{ zprava }}</span> {% else %} <span style="color: blue;">{{ zprava }}</span> {% endif %} {% endfor %} {% endblock %} </header> <div id="content"> {% block content %} {% endblock %} </div> <footer> {% block footer %} Prostý footer {% endblock %} </footer> </body> </html>
Výtečně, již jsme schopni informovat uživatele a nastavit zprávám kategorii
Zpráva po přihlášení vypadá takto:
A zpráva po odhlášení takto:
V příští lekci, SQLite3 databáze a přihlášení uživatelů ve Flask frameworku, se naučíme pracovat s databází a naše přihlašování upravíme tak, aby jsme se přihlašovali jako určitý registrovaný uživatel se svým heslem.
Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 71x (760.58 kB)
Aplikace je včetně zdrojových kódů v jazyce Python