IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

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:

smutná panda - Flask framework pre Python

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:

Vlastná stránka 404 v Pythone - Flask framework pre Python

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:

Flash správy vo Flask frameworku pre Python - Flask framework pre Python

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:

Flash hlásenie pri prihlásení používateľa vo Flask frameworku pre Python - Flask framework pre Python

A správa po odhlásení takto:

Flash hlásenie pri odhlásení používateľa vo Flask frameworku pre Python - Flask framework pre Python

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

 

Predchádzajúci článok
Prihlásenie užívateľov vo Flask
Všetky články v sekcii
Flask framework pre Python
Preskočiť článok
(neodporúčame)
Sqlite3 databázy a prihlásenie užívateľov vo Flask frameworku
Článok pre vás napísal MQ .
Avatar
Užívateľské hodnotenie:
1 hlasov
Používám hlavně Python a zajímám se o Deep Learning a vše kolem.
Aktivity