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í.

2. diel - Zoznámenie s Flask microframeworkem

V minulej lekcii, Úvod do frameworku Flask a webových aplikácií v Pythone , sme si vysvetlili ako fungujú webové aplikácie a prečo sú oveľa populárnejšie ako tie desktopové. V dnešnom Python tutoriálu sa už budeme venovať frameworku Flask.

Inštalácia

Pre inštaláciu potrebujeme Python3, ja osobne používam Python3.6 Miniconda distribúciu, ale Python už snáď máte nainštalovaný. Teraz otvoríme príkazový riadok alebo Anaconda Prompt a spustíme nasledujúci príkaz, ktorý nainštaluje Flask.

py -m pip install flask

Ak používate miniconda / anaconda, príkaz je len pip install flask.

Prvá aplikácia - Hello World

Najskôr si vytvoríme zložku, ktorú si môžete pomenovať ľubovoľne, a vytvoríme si v nej nový súbor main.py. Štruktúra zložky bude vyzerať nasledovne (priečinok, ktorý ste si vytvorili, budem v článku nazývať root, čo znamená anglicky koreň):

root/
    main.py

Sme pripravení a môžeme si napísať našu prvú aplikáciu vo fľašku, tou nebude nič iné ako Hello World :) Do súboru vložme:

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello_world():
    return "Hello World"

if __name__ == "__main__":
    app.run()

Najprv si importujeme triedu Flask, potom vytvoríme inštanciu tejto triedy, čo je aplikácia podľa štandardu WSGI. Ako parameter konstruktoru táto trieda požaduje názov modulu, v ktorom sa bude spúšťať. Podľa názvu modulu bude Flask hľadať Temple a statické súbory. Potom vytvoríme funkciu hello_world(), ktorá vracia text "Hello World" a pomocou dekorátoru ju nastavíme adresu. Skontrolujeme, či sa súbor spúšťa a nie je len niekam importovaný. Ak sa spúšťa, tak spustíme aplikáciu.

Aplikáciu spustíme príkazom py main.py z root/ zložky a potom pobeží na adrese http://127.0.0.1:5000/. Tú stačí teraz len otvoriť v prehliadači:

127.0.0.1:5000
127.0.0.1:5000

To bolo jednoduché, že?

Druhá aplikácia - Kalkulačka

Rovno si vytvoríme aj jednoduchú kalkulačku. Naučíme sa pracovať s Request a Jinja2 template enginom. Vytvorte si projekt v novej zložke. V článku na ňu budeme referovať opäť ako na root/.

Kalkulačka bude vykonávať nasledujúce matematické operácie:

  • súčet
  • rozdiel
  • súčin
  • podiel

Tentoraz toho budeme chcieť po aplikácii vykresliť viac, než len text. Ešte pred tým, než sa vrhneme na samotný Flask, si musíme navrhnúť šablónu, ktorú umiestnime do root/templates/kalkulacka.html. Okrem HTML kódu budeme v šablóne potrebovať vypísať výsledok, teda premennú. V Jinja2 template engine sa premenná vypíše ako {{ promenna }}.

Ak by sme v šablóne chceli vykonať nejaký príkaz, napr. Premenné priradiť hodnotu, vytvoriť cyklus alebo podmienku, použijeme tento zápis: {% set hodnota = 5 %}, {% for i in pole %} {{ i }} {% endfor %}, {% if hodnota == 5 %} hodnota je 5 {% endif %}. Ale nám dnes stačí výsledok len vypísať.

Obsah šablóny bude nasledujúci:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
</head>
<body>
    <form method="GET">
        <input type="number" name="prvni_cislo">
        <input type="text" name="operator">
        <input type="number" name="druhe_cislo">
        <input type="submit">
    </form>
    <hr>
    Výsledek: {{ vysledek }}
</body>
</html>

Náš template bude vyzerať v prehliadači nasledovne:

127.0.0.1:5000
127.0.0.1:5000

Teraz pridáme logiku aplikácie ako súbor main.py. Najskôr si vezmeme hodnoty z requestu, požiadavke odoslanom formulárom, a potom vrátime template s výsledkom:

from flask import Flask, render_template, request

app = Flask(__name__)

def secti(a, b):
    return float(a) + float(b)

def odecti(a, b):
    return float(a) - float(b)

def podil(a, b):
    return float(a) / float(b)

def soucin(a, b):
    return float(a) * float(b)

@app.route("/", methods = ["GET", "POST"]) # Povolíme metody GET a POST
def kalkulacka():
    prvni_cislo = request.args.get("prvni_cislo") # Získáme hodnotu z GET requestu
    druhe_cislo = request.args.get("druhe_cislo")
    operator = request.args.get("operator")

    if prvni_cislo is None or druhe_cislo is None:
        return render_template("template.html", vysledek = "Vyplň formulář")
    if (float(druhe_cislo) == 0 and operator == "/"):
        vysledek = "Nelze dělit nulou"
        return render_template("template.html", vysledek = vysledek)
    if (operator == "+"):
        vysledek = secti(prvni_cislo, druhe_cislo)
    elif (operator == "-"):
        vysledek = odecti(prvni_cislo, druhe_cislo)
    elif (operator == "/"):
        vysledek = podil(prvni_cislo, druhe_cislo)
    elif (operator == "*"):
        vysledek = soucin(prvni_cislo, druhe_cislo)
    else:
        vysledek = "Chyba"

    return render_template("kalkulacka.html", vysledek = vysledek) # Vrátíme naší šablonu s výsledkem

if __name__ == "__main__":
    app.run(debug=True)

Všimnite si, že vo funkcii app.run() sme nastavili parameter debug ako True. To znamená, že sa nám budú vypisovať chyby. V reálnej aplikácii nezabudnite debug nastaviť na False.

Hodnotu z requestu získame nasledujúcim spôsobom:

  • metóda GET
    • request.args["hodnota"] - Získame hodnotu z GET requestu, teda z parametrov URL adresy. Ak neexistujú, vyvolá error.
    • request.args.get("hodnota") - Získame hodnotu z GET requestu, ak neexistuje, vracia None. Ak máme hodnotu viackrát, vráti tú prvú.
    • request.args.getlist("hodnota") - Ak pošleme hodnotu viackrát, vráti nám list.
  • metóda POST
    • Obdobné metódy môžeme používať aj pre metódu POST:
    • request.form["hodnota"]
    • request.form.get("hodnota")
    • request.form.getlist("hodnota")
  • súbory
    • Pre prístup k odovzdaným súborom:
    • request.files["hodnota"]
    • request.files.get("hodnota")
    • request.files.getlist("hodnota")
  • GET + POST => preferuje GET:
    • A môžeme tiež pristupovať k jednej kolekcii, ktorá obsahuje ako GET, tak i POST parametre:
    • request.values["hodnota"]
    • request.values.get("hodnota")
    • request.values.getlist("hodnota")
Odosielanie formulára môžeme teraz vykonať metódou POST. V tomto prípade už nebudú parametre následne viditeľné v URL adrese, ale budú schované v tele požiadavke. U formulárov sa to tak robí častejšie:
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
</head>
<body>
    <form method="POST">
        <input type="number" name="prvni_cislo">
        <input type="text" name="operator">
        <input type="number" name="druhe_cislo">
        <input type="submit">
    </form>
    <hr>
    Výsledek: {{ vysledek }}
</body>
</html>

V súčasnej chvíli dostaneme nasledujúce error, pretože metóda POST nie je povolená:

405 Method Not Allowed
127.0.0.1:5000

Metódu POST povolíme a parametre vytiahneme z request.form namiesto z request.args:

from flask import Flask, render_template, request

app = Flask(__name__)

def secti(a, b):
    return float(a) + float(b)

def odecti(a, b):
    return float(a) - float(b)

def podil(a, b):
    return float(a) / float(b)

def soucin(a, b):
    return float(a) * float(b)

@app.route("/", methods = ["GET", "POST"]) # Povolíme metody GET a POST
def kalkulacka():
    prvni_cislo = request.form.get("prvni_cislo") #Získáme hodnotu z POST requestu
    druhe_cislo = request.form.get("druhe_cislo")
    operator = request.form.get("operator")
    if prvni_cislo is None or druhe_cislo is None:
        return render_template("template.html", vysledek = "Vyplň formulář")
    if (float(druhe_cislo) == 0 and operator == "/"):
        vysledek = "Nelze dělit nulou"
        return render_template("template.html", vysledek = vysledek)
    if (operator == "+"):
        vysledek = secti(prvni_cislo, druhe_cislo)
    elif (operator == "-"):
        vysledek = odecti(prvni_cislo, druhe_cislo)
    elif (operator == "/"):
        vysledek = podil(prvni_cislo, druhe_cislo)
    elif (operator == "*"):
        vysledek = soucin(prvni_cislo, druhe_cislo)
    else:
        vysledek = "Chyba"

    return render_template("kalkulacka.html", vysledek = vysledek) #Vrátíme naší šablonu s výsledkem

if __name__ == "__main__":
    app.run(debug=True)

Máme hotovo, aplikácia funguje rovnako dobre ako predtým. V prípade akýchkoľvek problémov je máte pod článkom obe k stiahnutiu. V budúcej lekcii, WTForms a Jinja2 šablóny pre Flask framework , kalkulačku zdokonalíte pomocou knižnice WTForms.


 

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é 210x (2.32 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Python

 

Predchádzajúci článok
Úvod do frameworku Flask a webových aplikácií v Pythone
Všetky články v sekcii
Flask framework pre Python
Preskočiť článok
(neodporúčame)
WTForms a Jinja2 šablóny pre Flask framework
Článok pre vás napísal MQ .
Avatar
Užívateľské hodnotenie:
2 hlasov
Používám hlavně Python a zajímám se o Deep Learning a vše kolem.
Aktivity