Flask intro
Teraz nadišiel čas vysvetliť, z čoho pozostával náš testovací program.
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Ahoj, svet!'
if __name__ == "__main__":
app.run()
Takže po poriadku.
Setup
from flask import Flask
Tento príkaz, očividne, importuje modul flask
do programového oboru mien (tzv. namespace) pod menom Flask
.
Je nutné vedieť ako fungujú moduly v Pythone, ak to teda nevieš, prečítaj si oficiálnu dokumentáciu modulov na python.org.
app = Flask(__name__)
vytvorí novú Flask inštanciu. Konštruktor Flasku má, ako vidno na odkazovanej dokumentácii, viac argumentov, ale povinný je len jeden (ktorý nám zatiaľ aj bude stačiť), a to import_name
, ktorý slúži primárne pre debugging. Pre naše účely úplne poslúži, ak bude mať vždy hodnotu __name__
(aj keď v realite to vždy tak nemusí byť).
__name__
je globálna premenná nastavovaná Python interpreterom a jej hodnota slúži na identifikáciu modulov pri spustení. Ak priamo spustíme skript, v ktorom je použitý__name__
, jeho hodnota bude__main__
, inak bude mať hodnotu názvu modulu v tvaremodule.submodule.subsubmodule
. Ku__name__
sa ešte vrátime, takže si tento odstavec zapamätaj.
Pridanie cesty
def hello_world():
return 'Ahoj, svet!'
Očividne, toto je klasická funkcia. Nikde sa ale v našom programe priamo nevolá. Ako sa o nej Flask môže vôbec dozvedieť a ešte ju k tomu aj v správnom momente zavolať?
Mágia sa skrýva nad riadkom def hello_world():
(↓)
@app.route('/')
Wut? Čo to sakra je to @
?
Nie je to žiadna mágia.
Je to syntaktický cukor dekorátora, čo je spôsob definovania funkcíí vyššieho rádu v Pythone.
Funkcie vyššieho rádu sú funkcie, ktoré príjmajú aspoň jednu funkciu ako argument, a/alebo nejakú funkciu vracajú.
Syntaktický cukor (syntactic sugar) je taká časť syntaxe jazyka, ktorá do neho nepridáva žiadnu novú funkcionalitu, ale skracuje/uľahčuje zápis kódu v špeciálnych, často používaných prípadoch.
Nech ťa to príliš netrápi. ak nevieš presne o čo sa jedná. Všetko čo potrebuješ vedieť je, že app.route()
, čo je funkcia Flasku, sa takto dozvie o našej funkcii hello_world()
. A nielen to.
Argument, s ktorým voláme route()
je relatívna cesta od koreňového web adresára, ktorú keď načítame, spustí sa naša dekorovaná funkcia. Čiže pri argumente /
sa hello_world
zavolá na adrese http://127.0.0.1:5000/
. Ak by argument bol hello/
, tak funkcia by sa zavolala na adrese http://127.0.0.1:5000/hello/
. Ak sa nejaká cesta v našom Python súbore neobjaví, ale my sa danú cestu pokúsime načítať v prehliadači, dostaneme späť Chybu 404.
Dekorátory
Ak ťa zaujíma, čo dekorátory robia, tu je rýchla ukážka:
@app.route('/') def hello_world(): return 'Ahoj, svet!'
pozrime sa teda, ako je definovaná funkcia
route
vo Flasku:
def route(self, rule, **options): def decorator(f): endpoint = options.pop('endpoint', None) self.add_url_rule(rule, endpoint, f, **options) return f return decorator
Teda na pozadí prebehne niečo takéto:
def hello_world(): return 'Ahoj, svet!' def route(self, rule='/', **options): def decorator(f=hello_world): endpoint = options.pop('endpoint', None) self.add_url_rule(rule, endpoint, f, **options) return f return decorator
kde
f
bude funktor, teda odkaz na funkciuhello_world()
.
Hlavná slučka Flask
if __name__ == "__main__":
app.run()
Pamätáš si ešte na __name__
a __main__
?
Táto podmienka zaistí, aby sa hlavná slučka Flasku, teda funkcia run()
, spustila iba vtedy, keď sa súbor, v ktorom sa príkaz app.run()
nachádza, v našom prípade main.py
, spustí priamo Python interpreterom. Inak povedané, run()
sa nespustí, ak main.py
importujeme do bežiaceho skriptu.
Hlavná slučka Flasku run()
sa nám postará o spustenie nášho vývojárskeho servera.