IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

3. diel - Path a query parametre vo FastAPI

V minulej lekcii, Zoznámenie s FastAPI frameworkom pre Python , sme si vytvorili svoju prvú webovú aplikáciu vo frameworku FastAPI pre Python. Založili sme projekt a vypísali hlášku "Hello World".

V dnešnom tutoriáli webových aplikácií s frameworkom FastAPI sa pozrieme na rozdiel medzi path a query parametrami. Vysvetlíme si význam a výhody typových anotácií a zameriame sa aj na nepovinné parametre funkcií.

V priebehu kurzu postupne vytvoríme filmovú databázu. Príklady (premenné, názvy tried, parametre a podobne) teda budeme pomenovávať v tomto duchu už teraz, aj keď samotný projekt začneme tvoriť až v neskorších lekciách.

Parametre path vs query

Parameter path ("parameter cesty") je parameter požiadavky vložený do URL adresy, ktorý ukazuje na špecifickú lokalitu zdroja. V URL je oddelený lomítkom od domény, napríklad v URL https://example.com/movies/1/ je číslovka jedna path parametrom (konkrétne sa jedná o id filmu, ako uvidíme neskôr). Tento parameter je povinnou súčasťou požiadavky na server a musí teda vždy niesť nejakú hodnotu, ktorú je možné zmeniť, pretože je dynamická. Oproti tomu je časť /movies/ v URL vyššie považovaná za súčasť cesty, ktorá je pevne daná, nemenná.

Zatiaľ čo path identifikuje lokalitu zdroja a hovorí tak našej aplikácii, KAM sa má pozrieť, query parameter ("dotazovací parameter") sa používa na posielanie a filtrovanie dát vo vnútri požiadavky. Hovorí aplikáciu AKO sa pozrieť do určitého zdroja. Užívateľský vstup (query) je poslaný ako premenná do query parametra, ktorý je od URL oddelený otáznikom. Query parametre možno tiež reťaziť. Oddeľujú sa od seba pomocou znaku apersand (&). Napríklad v URL https://example.com/movies/?id=1&movie_name=Star%20Wars posielame otázky na id, ktoré sa má rovnať 1, a movie_name, ktoré sa má rovnať Star Wars. Query parametre nie sú povinnou súčasťou požiadavky na server, pomáhajú však získať podrobnejšie či presnejšie dáta.

Kombinácia znakov %20 v URL znamená medzeru.

Ukážme si, ako sa oba typy parametrov definujú v aplikáciách vytvorených pomocou FastAPI.

Path parametre

Začneme tým, že si parameter path vyskúšame na našej aplikácii Hello World. Aplikáciu si otvoríme v IDE. V termináli ju potom spustíme:

Od minule pribudla v príkaze na spustenie servera časť --reload. Vďaka nej server sleduje zmeny v kóde uvedeného zdroja a pokiaľ nejaké zaznamená, automaticky obnoví stránku, čo sa pri vývoji skvele hodí.

Aplikácia sa spustí na localhostu ( http://127.0.0.1:8000/). Otvoríme si ju v prehliadači.

V IDE otvoríme jej súbor main.py a prepíšeme funkciu index(). Funkcia sa bude novo volať read_movie(). Ako argument prijme path parameter movie_id a vráti nám film so zodpovedajúcim id:

Syntax pripomína formátovaný reťazec. Hodnota path parametra movie_id (v dekorátore funkcie je uvedená v zložených zátvorkách) je dynamická a bude poslaná do funkcie ako argument movie_id v závislosti od požiadavky užívateľa.

Adresu localhostu doplníme o /movies/1 tak, aby vyzerala takto: http://127.0.0.1:8000/movies/1. Potvrdíme stlačením Enter a vypíše sa nám:

Pokiaľ budeme meniť poslednú číslicu v URL, bude sa zodpovedajúcim spôsobom meniť aj id zobrazené na stránke.

Typové anotácie a ich prednosti

FastAPI vie prijímať aj typové anotácie. Nie sú povinné, ale ide o dobrú prax, ktorú budeme dodržiavať. Má to iba výhody. Definíciu funkcie read_movie() upravíme takto:

Definovali sme, že funkcia read_movie() prijme ako parameter movie_id iba typ int. Tento nepatrný prípisok má veľké dôsledky. Vďaka nemu nám naše IDE ponúknu najrôznejšiu podporu vo vnútri takej funkcie, napríklad skontrolujú chyby, ponúknu automatické dokončenie a pod. Navyše, ak teraz navštívime http://127.0.0.1:8000/movies/1, všimneme si, že sa nám tentoraz vypísalo

Áno, id filmu sa pošle a vráti ako int, nie ako str v predchádzajúcom variante. Takže tým, že deklarujeme typ parametra, nám FastAPI ku všetkým skôr menovaným výhodám pridá ešte automatické parsovanie a taktiež validáciu dát. Keby sme totiž skúsili navštíviť napríklad http://127.0.0.1:8000/movies/jedna, vráti sa nám celkom podrobné chybové hlásenie upozorňujúce na nemožnosť spracovať str namiesto int, ktorý daná funkcia vyžaduje:

Query parametre

Odoslanie požiadavky na konkrétne dáta máme vyriešené a prejdeme teda na filtrovanie dát. Najskôr si vytvoríme malú improvizovanú databázu, nech máme v čom hľadať. Ako databáza nám poslúži slovník obsahujúci niekoľko ďalších slovníkov s údajmi o filmoch a ich režiséroch. Stále pre jednoduchosť pracujeme v main.py:

Naša funkcia pre vyhľadávanie filmov podľa parametrov sa bude volať find_movie. Dekorátor a hlavička funkcie bude podobná tej predchádzajúcej, ale telo sa bude líšiť. Upravme teda funkciu ešte raz:

Všimnime si, že v dekorátore tentokrát chýba dynamický path parameter movie_id a URL končí pevným parametrom /movies/. Naša funkcia prijíma parameter movie_name vo formáte str. Do premennej result sme si uložili chybovú hlášku pre prípad, že sa vyhľadávanie nepodarí. Potom prejdeme pomocou for cyklu našu improvizovanú databázu a pokiaľ v nej požadované meno filmu prevedené na malé znaky nenájdeme, vrátime užívateľovi pripravenú chybovú správu. Pokiaľ uspejeme, vrátime upravenú správu obsahujúcu id filmu a jeho detaily v podobe názvu a režiséra a ukončíme cyklus, pretože je zbytočné pokračovať v hľadaní.

Ak si teraz otvoríme http://localhost:8000/movies/?movie_name=Frozen, dostaneme späť:

Rôzne prehliadače si výstup formátujú po svojom. Takto v riadku ho zobrazia Opera a Chrome, no a Edge si ho rozložia na sedem riadkov. Na to treba myslieť a výstup do prehliadača prípadne naformátovať nútene pomocou JavaScriptu alebo HTML šablóny. Oboje si ukážeme ďalej v kurze.

Voliteľné parametre a východiskové hodnoty

Vo vyhľadávaní sa rozhodne nemusíme obmedzovať na jeden parameter. Nestačí ale iba pripísať ďalší parameter do funkcie, musíme z nich tiež urobiť nepovinné parametre. To docielime tým, že u nich umožníme zadať hodnotu None a definujeme jej východiskovú hodnotu. Pridajme si vyhľadávanie podľa režiséra:

Znak "|" na slovenskej klávesnici napíšeme pomocou AltGr + W

Parametre našej funkcie sú teraz movie_name a director, oboje typu str alebo None. V prípade, že ich užívateľská požiadavka nebude obsahovať (teda parametre budú mať hodnotu None), použije funkcia východiskovú hodnotu, čo je v oboch prípadoch None (preto zápis None = None, pokiaľ nie je zadaná hodnota, je None).

Telo funkcie sme tiež upravili, aby stačilo v databáze nájsť iba jeden zo záznamov a vrátil sa správny výsledok. Pokiaľ budú oba parametre None (teda pri pokuse o navštívenie http://localhost:8000/movies/), hľadanie v databáze ani neprebehne a vráti sa hneď správa o nenájdení filmu.

Ak teraz navštívime http://localhost:8000/movies/?movie_name=Shrek alebo http://localhost:8000/movies/?director=Vicky%20Jenson, uvidíme v oboch prípadoch zhodne:

Zdrojový kód je opäť priložený v archíve na konci lekcie.

V budúcej lekcii, Endpointy a automatická dokumentácia vo FastAPI , si ukážeme POST, PUT a DELETE endpointy vo FastAPI a vyskúšame si prácu s automatickou dokumentáciou.


 

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 100x (915 B)

 

Predchádzajúci článok
Zoznámenie s FastAPI frameworkom pre Python
Všetky články v sekcii
FastAPI - Tvorba webov v Pythone
Preskočiť článok
(neodporúčame)
Endpointy a automatická dokumentácia vo FastAPI
Článok pre vás napísal Tomáš Severa
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Aktivity