Lekce 2 - Seznámení s Flask microframeworkem
V minulé lekci, Úvod do frameworku Flask a webových aplikací v Pythonu, jsme si vysvětlili jak fungují webové aplikace a proč jsou mnohem populárnější než ty desktopové.
V dnešním Python tutoriálu se budeme věnovat frameworku Flask.
Instalace
Pro instalaci potřebujeme Python3, já osobně používám Python3.6 Miniconda distribuci, ale Python již snad máte nainstalovaný. Nyní otevřeme příkazový řádek nebo Anaconda Prompt a spustíme následující příkaz, který nainstaluje Flask.
py -m pip install flask
Pokud používáte miniconda/anaconda, příkaz je jen
pip install flask
.
První aplikace - Hello World
Nejdříve si vytvoříme složku, kterou si můžete pojmenovat libovolně,
a vytvoříme si v ní nový soubor main.py
. Struktura složky bude
vypadat následovně (složku, kterou jste si vytvořili, budu v článku
nazývat root
, což znamená anglicky kořen):
root/ main.py
Jsme připraveni a můžeme si napsat naši první aplikaci ve Flasku, tou nebude nic jiného než Hello World Do souboru vložme:
from flask import Flask app = Flask(__name__) @app.route("/") def hello_world(): return "Hello World" if __name__ == "__main__": app.run()
Nejprve si importujeme třídu Flask
, poté vytvoříme instanci
této třídy, což je aplikace podle standardu WSGI. Jako parametr
konstruktoru tato třída požaduje název modulu, ve kterém se bude
spouštět. Podle názvu modulu bude Flask hledat templaty a statické soubory.
Poté vytvoříme funkci hello_world()
, která vrací text "Hello
World" a pomocí dekorátoru ji nastavíme adresu. Zkontrolujeme, zda se soubor
spouští a není jen někam importován. Pokud se spouští, tak spustíme
aplikaci.
Aplikaci spustíme příkazem py main.py
z root/
složky a poté poběží na adrese http://127.0.0.1:5000/
. Tu
stačí nyní jen otevřít v prohlížeči:
To bylo jednoduché, že?
Druhá aplikace - Kalkulačka
Rovnou si vytvoříme i jednoduchou kalkulačku. Naučíme se pracovat s
requesty a Jinja2 template enginem. Vytvořte si projekt v nové složce. V
článku na ni budeme referovat opět jako na root/
.
Kalkulačka bude provádět následující matematické operace:
- součet
- rozdíl
- součin
- podíl
Tentokrát toho budeme chtít po aplikaci vykreslit více, než pouhý text.
Ještě před tím, než se vrhneme na samotný Flask, si musíme navrhnout
šablonu, kterou umístíme do root/templates/kalkulacka.html
.
Kromě HTML kódu budeme v šabloně potřebovat vypsat výsledek, tedy
proměnnou. V Jinja2 template enginu se proměnná vypíše jako
{{ promenna }}
.
Pokud bychom v šabloně chtěli vykonat nějaký příkaz,
např. proměnné přiřadit hodnotu, vytvořit cyklus nebo podmínku,
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ýsledek pouze vypsat.
Obsah šablony bude následující:
<!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 vypadat v prohlížeči následovně:
Nyní přidáme logiku aplikace jako soubor main.py
. Nejdříve
si vezmeme hodnoty z requestu, požadavku odeslaném formulářem, a poté
vrátíme template s výsledkem:
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šimněte si, že ve funkci app.run()
jsme
nastavili parametr debug
jako True
. To znamená, že
se nám budou vypisovat chyby. V reálné aplikaci nezapomeňte
debug
nastavit na False
.
Hodnotu z requestu získáme následujícím způsobem:
- Metoda GET
request.args["hodnota"]
- Získáme hodnotu z GET requestu, tedy z parametrů URL adresy. Pokud neexistují, vyvolá error.request.args.get("hodnota")
- Získáme hodnotu z GET requestu, pokud neexistuje, vracíNone
. Pokud máme hodnotu víckrát, vrátí tu první.request.args.getlist("hodnota")
- Pokud pošleme hodnotu víckrát, vrátí nám list.
- Metoda POST
- Obdobné metody můžeme používat i pro metodu POST:
request.form["hodnota"]
request.form.get("hodnota")
request.form.getlist("hodnota")
- Soubory
- Pro přístup k nahraným souborům:
request.files["hodnota"]
request.files.get("hodnota")
request.files.getlist("hodnota")
- GET + POST => preferuje GET:
- A můžeme také přistupovat k jedné kolekci, která obsahuje jak GET, tak i POST parametry:
request.values["hodnota"]
request.values.get("hodnota")
request.values.getlist("hodnota")
Odesílání formuláře můžeme nyní provést metodou POST. V tomto případě již nebudou parametry následně viditelné v URL adrese, ale budou schované v těle požadavku. U formulářu se to tak dělá častěji:
<!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 současné chvíli dostaneme následující error, jelikož metoda POST není povolena:
Metodu POST povolíme a parametry vytáhneme z request.form
namísto 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, aplikace funguje stejně dobře jako předtím. V případě jakýchkoli problémů je máte pod článkem obě ke stažení.
V příští lekci, WTForms a Jinja2 šablony pro Flask framework, zdokonalíme kalkulačku pomocí knihovny WTForms.
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 230x (2.32 kB)
Aplikace je včetně zdrojových kódů v jazyce Python