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 tvare module.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 funkciu hello_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.

results matching ""

    No results matching ""