6. diel - Zobrazenie správ a vlastné 404 stránka vo Flask
V minulej lekcii, Prihlásenie užívateľov vo Flask , sme si vytvorili prihlasovací formulár a
meno aktuálne prihláseného používateľa sme ukladali do
session
. Tiež sme si aplikáciu rozdelili na jednotlivé moduly. V
dnešnom Python Flask tutoriálu si ukážeme, ako užívateľovi zobraziť
informačnú správu s kategórií, a vytvoríme si vlastnú stránku, ktorá sa
zobrazí ak nastane chyba 404.
Vlastné 404 stránka
Najskôr si vytvoríme šablónu, ktorá sa bude zobrazovať, keď nastane
chyba 404. Teda v prípade, keď používateľ vyžiada URL adresu, ktorá v
našej aplikácii neexistuje. Stiahnite si obrázok nižšie, alebo použite
ktorýkoľvek iný, a uložte ho do zložky /projekt/root/static/
ako sad_panda.jpg
:
Najskôr si vytvoríme funkciu v súbore root/error_handlers.py
,
ktorá nám bude vracať šablónu a status 404:
from flask import render_template def error_404(error): return render_template("404.html"), 404
Potom vytvoríme šablónu root/templates/404.html
, ktorá sa
bude zobrazovať užívateľovi:
<!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>
Ako ste si iste všimli, táto šablóna odkazuje na url
homepage
, ktorá neexistuje. Preto premenujeme funkciu
kalkulacka()
v module projekt/root/__init__.py
na
homepage()
a presmerujeme užívateľa:
@app.route("/") def homepage(): return redirect(url_for("galerie_page.galerie"))
Naši funkciu, ktorá vracia chybovú stránku, musíme zaregistrovať v
súbore 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 vyzerá nasledovne:
Flash správy
Flash správy slúži na rýchle odovzdanie informácie užívateľovi.
Keďže na webe sa na rozdiel od desktopových aplikácií neustále presúvame
zo stránky na stránku, je inak ťažké spoznať, či sa akcia naozaj
podarila. Ľudia sú na podobnú komunikáciu na webe zvyknutí a flash správy
im pomáhajú v orientácii aplikácií. My upozorníme nášho užívateľa,
keď sa úspešne prihlási. Úpravu vykonáme v module
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)
Najskôr importujeme funkciu flash()
, aby sme mohli takúto
správu vytvoriť. Po prihlásení vytvoríme správu o úspešnom prihlásení.
Prvý parameter funkcia je text správy a druhý nepovinný je kategória, čo
umožňuje správy kategorizovať ako napr. Úspech, chyba, informácie,
varovania a podobne. Rôzne kategórie potom môžeme vykresľovať
užívateľovi napr. Inak farebné alebo s inými ikonami. Najskôr ale
dokončíme príklad so správou bez špeciálnej kategórie.
Upravíme si template složka projektu/root/templates/base.html
,
aby nám zobrazovala všetky flash správy.
Flash správ môže byť vytvorených viac naraz.
<!-- 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>
Namiesto {% set zpravy = get_flashed_messages() %}
môžeme
použiť aj blok {% with zpravy = get_flashed_messages() %}
, ktorý
musíme ukončiť {% endwith %}
.
Teraz sa nám po prihlásení zobrazí hlásenie:
Teraz správe potvrdzujúcej prihlásenie priradíme kategórii
"info"
. Po odhlásení tiež informuje užívateľa správou s
kategóriou "critical"
. Kategórie si môžete pomenovať podľa
ľubovôle, ale názov by mal byť vždy zmysluplný.
Úpravu prihlasovacie správy vykonáme v module
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)
Pridanie odhlásenia sa vykonáme v module
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"))
Najskôr skontrolujeme, či bol používateľ vôbec prihlásený, aby odhlásenie dávalo zmysel, a potom správu vypíšeme.
Aby sme mohli správy filtroval podľa kategórie, musíme nastaviť funkciu
get_flashed_messages()
parameter with_categories=True
.
Kategóriu následne získame spolu so sprá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ýborne, už sme schopní informovať užívateľa a nastaviť správam kategórii
Správa po prihlásení vyzerá takto:
A správa po odhlásení takto:
V budúcej lekcii, Sqlite3 databázy a prihlásenie užívateľov vo Flask frameworku , sa naučíme pracovať s databázou a naše prihlasovanie upravíme tak, aby sme sa prihlasovali ako určitý registrovaný užívateľ so svojím heslom.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 71x (760.58 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Python