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:
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:
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, vraciaNone
. 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")
<!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á:
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é 228x (2.32 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Python