Lekce 2 - Seznámení s FastAPI frameworkem pro Python
V minulé lekci, Úvod do FastAPI frameworku a webových aplikací v Pythonu, jsme absolvovali úvod do webových aplikací prostřednictvím frameworku FastAPI.
V dnešním tutoriálu webových aplikací s frameworkem FastAPI se vrhneme na samotný framework. Nejprve si jej nainstalujeme a poté vytvoříme svou první webovou aplikaci v Pythonu.
Instalace FastAPI
Pro instalaci FastAPI (v kurzu budeme používat verzi 0.104.0) potřebujeme Python ve verzi 3.10 nebo novější, s tím budeme počítat i v kurzu. Budeme potřebovat také server, konkrétně Uvicorn. Uvicorn je ASGI (Asynchronous Server Gateway Interface) server, který se často používá pro nasazení webových aplikací vytvořených pomocí FastAPI. Oba balíčky nainstalujeme následujícími příkazy, které vložíme do příkazového řádku terminálu:
Instalace FastAPI: pip install "fastapi" pip install "uvicorn[standard]"
To je prozatím vše, co budeme potřebovat. V příkazovém řádku uvidíme výstup (zde zkrácený, protože je poněkud dlouhý):
Výstup instalace: C:\Users\tomse>pip install "fastapi" Collecting fastapi Obtaining dependency information for fastapi from https://files.pythonhosted.org/packages/f3/4f/0ce34195b63240b6693086496c9bab4ef23999112184399a3e88854c7674/fastapi-0.104.1-py3-none-any.whl.metadata Downloading fastapi-0.104.1-py3-none-any.whl.metadata (24 kB) ... Successfully installed annotated-types-0.6.0 anyio-3.7.1 fastapi-0.104.1 idna-3.4 pydantic-2.4.2 pydantic-core-2.10.1 sniffio-1.3.0 starlette-0.27.0 typing-extensions-4.8.0 Collecting uvicorn[standard] Obtaining dependency information for uvicorn[standard] from https://files.pythonhosted.org/packages/79/96/b0882a1c3f7ef3dd86879e041212ae5b62b4bd352320889231cc735a8e8f/uvicorn-0.23.2-py3-none-any.whl.metadata Using cached uvicorn-0.23.2-py3-none-any.whl.metadata (6.2 kB) ... Successfully installed click-8.1.7 colorama-0.4.6 h11-0.14.0 httptools-0.6.1 python-dotenv-1.0.0 pyyaml-6.0.1 uvicorn-0.23.2 watchfiles-0.21.0 websockets-12.0
Pozor, musíme dodržet přesné verze modulů,
komponent a zkrátka všech verzovaných prvků! Ve FastAPI budeme
později vytvářet docela pokročilý projekt, který závisí na množství
knihoven, databázi atd. Použít nejnovější verzi nějaké komponenty,
která zrovna včera vyšla, opravdu není dobrý nápad. Projekt pak bez
odborné úpravy pravděpodobně nebude fungovat! Za dobrý příklad poslouží
knihovna Pandas
, která ve verzi 2.0 ztratila podporu pro metodu
append()
. Nahradila ji metoda concat()
, samozřejmě s
jinou syntaxí. U verzí knihoven, modulů atd. zkrátka neplatí jako např. u
aktualizace Windows, že chceme každý den používat tu nejnovější.
Neustálé aktualizace všeho by totiž vyžadovaly každodenní a komplexní
změny kódu projektu a reálně se tak neprovádějí. Ze stejného důvodu i
my aktualizujeme kurzy v pravidelných intervalech a nové verze k sobě pak
sladíme tak, aby vše fungovalo.
Vytvoření projektu
Vytvoříme si pracovní složku pro nový projekt s názvem
mysite/
. FastAPI nám nechává volnou ruku a na rozdíl od např.
Djanga nevyžaduje žádnou konkrétní strukturu projektu. My si tedy jen v
naší složce mysite/
vytvoříme soubor main.py
. A
to je vše, prozatím se nám všechen kód vejde do jediného souboru. Jde to
vážně fast, že?
Vytvoření aplikace Hello World
V nastaveném minimalismu budeme pokračovat. Podržíme se nepsaného pravidla a jako první FastAPI aplikaci vytvoříme "Hello World". Také v tomto případě budeme raz dva hotoví.
Na první řádek v našem main.py
přijde tradičně
specifikace závislostí, které chceme do naší aplikace importovat, v našem
případě zatím pouze:
from fastapi import FastAPI
Pod tím vytvoříme instanci třídy FastAPI
, kterou jsme si
právě naimportovali. Třída obsahuje veškerou potřebnou funkcionalitu
frameworku:
app = FastAPI()
Obvykle se instance FastAPI
ukládá do proměnné pojmenované
právě jako app
. Název je ve skutečnosti na nás, jde jen o
konvenci. Pokud ale použijeme vlastní název, trochu se tím změní kód a
příkaz na spuštění serveru. To ale uvidíme za chvíli.
Teď už jen vytvoříme funkci, která vrátí obligátní hlášku:
@app.get("/") async def index(): return {"message": "Hello World"}
A to je celé, doslova pár řádků a máme hotovou aplikaci!
V prvním řádku funkce, kterou jsme teď napsali, je dekorátor. FastAPI je používá k
definici cest (často se také pro ně používají termíny
"endpoint" nebo "routa") a operací, tedy HTTP metod, které
udávají druh požadavku a specifikují akci, která má být provedena na
nějakých zdrojích. V našem případě tedy kód říká: "Níže definovaná
funkce index()
má na starosti GET
požadavky
mířící na adresu "/"
".
Všimněme si, že dekorátor app()
odpovídá naší proměnné
app
, v níž je uložená instance FastAPI
. Pokud
bychom si proměnnou pojmenovali třeba my_awesome_app
, měla by
naše funkce index()
dekorátor
@my_awesome_app.get("/")
.
Ve druhém řádku definujeme dekorovanou funkci index()
.
Slůvko async
říká, že půjde o tzv. asynchronní funkci.
FastAPI je podporuje defaultně. My jejich výhody zatím nepocítíme, ale je
určitě dobré o nich vědět. Je to jedna z předností frameworku.
Vynecháním async
by se z naší index()
funkce stala
běžná funkce a fungovala by úplně stejně.
Ve zkratce, princip asynchronního kódu umožňuje vykonávat několik operací paralelně, aby některá z těch pomaleji prováděných "nebrzdila" celou aplikaci.
No a nakonec ve třetím řádku jen vracíme požadovanou odpověď ve formátu JSON.
Spuštění serveru
Z úvodní lekce již víme, že pro to, abychom mohli k naší aplikaci přistoupit přes webový prohlížeč, potřebujeme server.
Jako server budeme používat Uvicorn, který jsme si nainstalovali na
začátku lekce. Spuštění serveru provedeme zadáním stejnojmenného
příkazu. K tomu potřebujeme otevřít příkazový řádek ve složce
mysite/
, kde se nachází náš soubor s aplikací, tedy
main.py
.
Zadáme příkaz:
uvicorn main:app
Po chvíli se do konzole vypíše:
Server běží:
INFO: Started server process [14972]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
Všimněme si, že parametr app
v uvicorn příkazu je opět
stejný jako název proměnné app
s naší instancí třídy
FastAPI
. Název Main
naopak odpovídá jménu modulu
obsahujícího aplikaci, v našem případě tedy main.py
.
Naše aplikace nyní běží na lokálním serveru na adrese
http://localhost:8000/
. Zadáme tuto adresu do svého webového
prohlížeče nebo klikneme na odkaz v konzoli. Uvidíme výsledek našeho
snažení:
{ "message": "Hello World" }
V příkazovém řádku budeme vypisovat všechny požadavky na server.
Pokud budeme chtít server ukončit, stiskneme Ctrl + C.
Zdrojový kód je přiložený na konci lekce.
V příští lekci, Path a query parametry ve FastAPI, si vysvětlíme rozdíly mezi path a query parametry a přiblížíme si význam typových anotací a nepovinných parametrů funkcí.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkamiStaženo 135x (640 B)