Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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:

Smutná panda - Flask framework pro Python

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ě:

Vlastní stránka 404 v Pythonu - Flask framework pro Python

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:

Flash zprávy ve Flask frameworku pro Python - Flask framework pro Python

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:

Flash zpráva při přihlášení uživatele ve Flask frameworku pro Python - Flask framework pro Python

A zpráva po odhlášení takto:

Flash zpráva při odhlášení uživatele ve Flask frameworku pro Python - Flask framework pro Python

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 63x (760.58 kB)
Aplikace je včetně zdrojových kódů v jazyce Python

 

Předchozí článek
Přihlášení uživatelů ve Flask
Všechny články v sekci
Flask framework pro Python
Přeskočit článek
(nedoporučujeme)
SQLite3 databáze a přihlášení uživatelů ve Flask frameworku
Článek pro vás napsal MQ .
Avatar
Uživatelské hodnocení:
21 hlasů
Používám hlavně Python a zajímám se o Deep Learning a vše kolem.
Aktivity