Python se díky své pohodlnosti a všestrannosti používá k vytváření softwaru téměř ve všech oblastech IT. Jednou z hlavních nik jsou webové služby, kde rychlost vývoje a flexibilní metafory jazyka Python usnadňují rychlé zprovoznění webových stránek.
A přesně jak asi tušíte, Python vám dává spoustu možností a volnosti v oblasti webových frameworků, malých i velkých. Koneckonců ne každý webový projekt musí být podnikového rozsahu. Většina by měla být tak akorát velká, aby se dala udělat práce, a ne větší. Tento článek přináší přehled osmi nejznámějších frameworků pro Python, které kladou důraz na jednoduchost, nenáročnost a úzké zaměření.
Bottle
Bottle by se dal považovat za jakýsi mini-Flask, protože je ještě kompaktnější a stručnější než tento jiný „mikroframework“. Díky svým minimálním rozměrům je Bottle ideální pro začlenění do jiných projektů nebo pro rychlé dodání malých projektů, jako jsou rozhraní REST API. (O Flasku je řeč níže.)
Celá kódová základna Bottle se vejde do jediného souboru a nemá absolutně žádné externí závislosti. I tak je Bottle vybaven dostatkem funkcí pro vytváření běžných druhů webových aplikací, aniž by se musel spoléhat na vnější pomoc.
Systém směrování v Bottle, který mapuje adresy URL na funkce, má téměř stejnou syntaxi jako Flask. Nejste také omezeni na pevně danou sadu cest; můžete je vytvářet dynamicky. K datům požadavků a odpovědí, souborům cookie, proměnným dotazů, formulářovým datům z akce POST, hlavičkám HTTP a nahrávání souborů lze v Bottle přistupovat a manipulovat s nimi prostřednictvím objektů.
Každá možnost byla implementována s velkým důrazem na detail. Například při nahrávání souborů nemusíte soubor přejmenovávat, pokud jeho jmenná konvence koliduje s cílovým souborovým systémem (například lomítka v názvu v systému Windows). Bottle to může udělat za vás.
Bottle obsahuje vlastní jednoduchý šablonovací engine HTML. Ačkoli je šablonovací engine minimální, opět obsahuje vše podstatné. Proměnné obsažené v šabloně se ve výchozím nastavení vykreslují pomocí bezpečného jazyka HTML; pro doslovnou reprodukci je třeba uvést, které proměnné jsou bezpečné. Pokud byste raději vyměnili šablonovací engine Bottle za jiný, například Jinja2, Bottle vám to umožní bez starostí. Já dávám přednost systému jednoduchých šablon dodávanému s Bottle; je rychlý, jeho syntaxe je nenáročná a umožňuje bez zbytečných potíží míchat kód a text šablony.
Bottle dokonce podporuje více serverových konců. Dodává se s vlastním vestavěným miniserverem pro rychlé testování, ale také bude podporovat obecné WSGI, širokou škálu WSGI-kompatibilních HTTP serverů a v případě potřeby i obyčejné staré CGI.
Bottle nepotřebuje tolik dokumentace jako jiné frameworky, ale dokumentace není v žádném případě skoupá. Všechny zásadní věci se vejdou na jedinou (i když dlouhou) webovou stránku. Kromě toho zde najdete úplnou dokumentaci ke každému API, příklady nasazení na různých infrastrukturách, vysvětlení vestavěného šablonovacího jazyka a spoustu běžných receptů.
Stejně jako u Flasku můžete funkce Bottle rozšiřovat ručně nebo pomocí zásuvných modulů. Zásuvných modulů Bottle není zdaleka tolik jako u Flasku, ale jsou mezi nimi užitečné kousky, například integrace s různými databázovými vrstvami a základní ověřování uživatelů. Pro asynchronní podporu může Bottle použít některý z existujících serverových adaptérů, které běží asynchronně, například aiohttp/uvloop, ale async/await
není nativně podporován.
Jedním z důsledků minimalismu Bottle je, že některé položky tam prostě nejsou. Není zahrnuta validace formuláře, včetně funkcí, jako je ochrana CSRF (cross-site request forgery). Pokud chcete vytvořit webovou aplikaci, která podporuje vysoký stupeň interakce s uživatelem, budete si muset tuto podporu přidat sami.
Dalším problémem Bottle je, že se vývoj zastavil; poslední bodová verze 0.12 vyšla v roce 2013. Přesto je Bottle nadále udržován a jeho vývojová vydání jsou nadále použitelná pro produkci. Vývojáři mají v úmyslu dodávat nové verze, které se zbaví podpory starších vydání Pythonu.
CherryPy
CherryPy existuje v té či oné podobě již téměř 20 let, ale neztratil minimalismus a eleganci, kterými se vyznačoval od počátku.
Cílem CherryPy, kromě toho, že obsahuje pouze holé kousky potřebné k obsluze webových stránek, je, aby pokud možno nepůsobil jako „webový framework“, ale jako jakýkoli jiný druh aplikace v jazyce Python. Stránky jako Hulu a Netflix používají CherryPy ve výrobě, protože framework poskytuje velmi nenápadný základ, na kterém lze stavět. CherryPy používá pod kapotou sdružená vlákna, tím lépe podporuje vícevláknové serverové adaptéry.
CherryPy umožňuje oddělit webovou aplikaci od základní logiky. Chcete-li namapovat funkce své aplikace na adresy URL nebo trasy obsluhované CherryPy, vytvoříte třídu, kde se jmenné prostory objektů mapují přímo na adresy URL, které chcete obsluhovat. Například kořen webové stránky zajišťuje funkce s názvem „index“. Parametry předávané těmto funkcím slouží ke zpracování proměnných poskytovaných metodami GET nebo POST.
Bity, které CherryPy obsahuje, mají fungovat jako nízkoúrovňové stavební bloky. Zahrnuty jsou identifikátory relací a zpracování souborů cookie, ale šablonování HTML zahrnuto není. Stejně jako Bottle nabízí CherryPy způsob mapování tras na adresáře na disku pro statické obsluhování souborů.
CherryPy často odkáže na existující knihovnu třetí strany, aby podporovala určitou funkci, místo aby ji poskytovala nativně. Například aplikace WebSocket nejsou podporovány přímo CherryPy, ale prostřednictvím knihovny ws4py.
Dokumentace k CherryPy obsahuje praktický výukový průvodce různými aspekty programu. Na rozdíl od některých jiných výukových programů pro frameworky vás neprovede kompletní aplikací od začátku do konce, ale i tak je užitečný. Dokumentace obsahuje praktické poznámky o nasazení ve virtuálních hostitelích, reverzním proxy serveru přes Apache a Nginx a mnoha dalších scénářích.
Falcon
Pokud vytváříte API založené na REST a nic jiného, Falcon byl vytvořen právě pro vás. Štíhlý a rychlý, téměř bez závislostí mimo standardní knihovny, Falcon poskytuje vše, co potřebujete pro rozhraní API REST, a nic víc. Falcon 2.0, vydaný v roce 2019, se zbavuje podpory Pythonu 2.x a vyžaduje alespoň Python 3.5.
Velká část toho, proč si Falcon vysloužil označení „lehký a štíhlý“, má jen málo společného s počtem řádků kódu ve frameworku. Je to proto, že Falcon nevnucuje aplikacím téměř žádnou vlastní strukturu. Jediné, co musí aplikace Falcon udělat, je uvést, které funkce se mapují na které koncové body API. Vrácení JSON z koncového bodu zahrnuje jen o málo více než nastavení trasy a vrácení dat pomocí funkce json.dumps
ze standardní knihovny jazyka Python. Podpora asynchronizace zatím ve Falconu nepřistála, ale pracuje se na tom, aby se tak stalo ve Falconu 3.0.
Falcon také používá rozumné výchozí nastavení out-of-the-box, takže pro nastavení je potřeba jen málo úprav. Například pro každou trasu, která není explicitně deklarována, je ve výchozím nastavení vyvoláno 404. Pokud chcete klientovi vracet chyby, můžete vyvolat jednu z řady standardních výjimek dodávaných s frameworkem (například HTTPBadRequest
) nebo použít obecnou výjimku falcon.HTTPError
. Pokud potřebujete předzpracování nebo následné zpracování trasy, Falcon poskytuje háčky i pro ně.
Zaměření Falconu na rozhraní API znamená, že je zde jen málo možností pro vytváření webových aplikací s běžným uživatelským rozhraním HTML. Nečekejte například mnoho funkcí pro zpracování formulářů a nástrojů pro ochranu CSRF. Přesto Falcon poskytuje elegantní možnosti rozšíření svých funkcí, takže lze vytvářet sofistikovanější položky. Kromě výše zmíněného mechanismu háčkování zde najdete rozhraní pro vytváření middlewaru, kterým lze obalit všechna rozhraní API Falconu.
Dokumentace k Falconu je ve srovnání s jinými frameworky štíhlá, ale jen proto, že je toho méně. Uživatelská příručka obsahuje formální postupný přehled všech hlavních funkcí spolu s oddílem pro rychlý start, který umožňuje zobrazit ukázkový kód s anotacemi nebo bez nich.
FastAPI
Jméno FastAPI dobře vystihuje, co dělá. Je vytvořen pro rychlé vytváření koncových bodů API a také rychle běží.
FastAPI využívá pro své vysokorychlostní síťové jádro projekt Starlette, ale k používání FastAPI nepotřebujete znát vnitřnosti Starlette. Koncové body definujete podobně jako aplikace Flask nebo Bottle – pomocí dekorátorů určíte, které funkce obsluhují které trasy, a pak vrátíte slovníky, které se automaticky přeloží do JSON.
To, jak se věci vracejí, můžete snadno přepsat. Pokud například chcete z některých koncových bodů vracet HTML/XML, můžete to udělat tak, že jednoduše vrátíte vlastní objekt Response
. Pokud chcete přidat vlastní middleware, můžete do něj vložit cokoli, co se řídí standardem ASGI.
FastAPI využívá typovou nápovědu jazyka Python k poskytování omezení pro druhy dat, které trasy přijímají. Například pokud máte trasu s typem Optional
, FastAPI odmítne všechna podání kromě celých čísel. Do koncových bodů nemusíte přidávat kód pro ověřování dat; stačí použít typové nápovědy a nechat FastAPI, aby se o to postaral.
Některé věci jsou přirozeně vynechány. Chybí například nativní engine šablon HTML, ale není nouze o řešení třetích stran, která tuto mezeru zaplní. Totéž platí o připojení k databázi, ale dokumentace obsahuje podrobnosti o tom, jak přimět některé ORM (např. Peewee), aby pracovaly s asynchronním chováním FastAPI.
Flask
Mnoho diskusí o webových frameworcích v Pythonu začíná u Flasku, a to z dobrého důvodu. Flask je dobře zavedený, dobře pochopený framework, který se snadno používá a je poměrně stabilní. Je téměř nemožné udělat chybu, když Flask použijete pro lehký webový projekt nebo základní rozhraní REST API, ale pokud se pokusíte vytvořit něco většího, čeká vás těžká práce.
Hlavním lákadlem Flasku je jeho nízká vstupní bariéra. Základní aplikaci „hello world“ lze vytvořit na méně než 10 řádcích jazyka Python. Flask obsahuje široce používaný šablonovací systém HTML Jinja2, který usnadňuje vykreslování textu, ale Jinja2 lze vyměnit za libovolný počet jiných šablonovacích strojů (například Mustache) nebo si můžete vytvořit vlastní.
V zájmu jednoduchosti Flask vynechává vychytávky, jako je datová vrstva nebo ORM, a nenabízí žádná opatření, jako je validace formulářů. Flask však lze rozšířit pomocí rozšíření, kterých existují desítky a pokrývají mnoho běžných případů použití, jako je ukládání do mezipaměti, zpracování a validace formulářů a připojení k databázi. Tento standardně štíhlý design vám umožní začít navrhovat aplikaci Flask s naprostým minimem funkcí a pak na sebe vrstvit jen ty části, které potřebujete, když je potřebujete.
Dokumentace Flasku je geniální a snadno čitelná. Dokument pro rychlý start vás skvěle uvede do práce a zároveň vysvětlí význam výchozích voleb pro jednoduchou aplikaci Flask a dokumentace API je plná dobrých příkladů. Výborná je také sbírka úryvků Flask, což jsou rychlé a špinavé příklady, jak provést konkrétní úkoly, například jak vrátit objekt, pokud existuje, nebo chybu 404, pokud neexistuje.
Flask se v roce 2018 dočkal své milníkové verze 1.0, přičemž minimálními podporovanými verzemi jsou Python 2.6 a Python 3.3, a mnoho jeho chování je konečně pevně stanoveno. Flask výslovně nepodporuje asynchronní syntaxi jazyka Python, ale pro uspokojení tohoto požadavku byla vyčleněna varianta Flasku kompatibilní s API s názvem Quart.
Pyramid
Malý a lehký Pyramid se dobře hodí pro úkoly, jako je vystavení existujícího kódu Pythonu jako REST API nebo poskytnutí jádra pro webový projekt, kde většinu těžké práce dělá vývojář.
„Pyramid vám umožní rychle se stát produktivními a poroste s vámi,“ říká dokumentace. „Nebude vás brzdit, když je vaše aplikace malá, a nebude vám překážet, když se vaše aplikace stane velkou.“
Dobrým způsobem, jak popsat minimalismus Pyramidu, by bylo „bez politiky“, což je termín použitý v části dokumentace, která pojednává o tom, jak se Pyramid staví k ostatním webovým frameworkům. V podstatě „free of policy“ znamená, že to, jakou databázi nebo jaký šablonovací jazyk se rozhodnete použít, Pyramid nezajímá.
K vytvoření základní aplikace Pyramid je potřeba jen velmi málo práce. Stejně jako u Bottle a Flask se aplikace Pyramid může skládat z jediného souboru Pythonu, kromě souborů pro samotný framework. Jednoduché API pro jednu trasu nevyžaduje více než tucet řádků kódu. Většinu z toho tvoří šablony, jako jsou příkazy from … import
a nastavení serveru WSGI.
Ve výchozím nastavení Pyramid obsahuje několik položek, které jsou běžné ve webových aplikacích, ale jsou poskytovány jako komponenty, které lze sešít dohromady, nikoli jako plnohodnotná řešení. Například podpora uživatelských relací je dokonce vybavena ochranou CSRF. Podpora uživatelských účtů, jako je přihlašování nebo správa účtů, však součástí není. Budete si ji muset vytvořit sami nebo ji přidat prostřednictvím zásuvného modulu. Totéž platí pro zpracování formulářů a připojení k databázi.
Pyramid dokonce poskytuje možnost vytvářet šablony z předchozích projektů Pyramid a znovu tak využít předchozí práci. Tyto šablony, nazývané „lešení“, vygenerují aplikaci Pyramid s jednoduchým směrováním a několika startovacími šablonami HTML/CSS. Přiložené scaffoldy zahrnují ukázkový startovací projekt a projekt, který se připojuje k databázím prostřednictvím populární knihovny Python SQLAlchemy.
Štíhlé testovací a ladicí nástroje Pyramidy si s tím poradí. Připojte debugtoolbar
rozšíření k aplikaci Pyramid a na každé webové stránce získáte klikatelnou ikonu, která generuje podrobnosti o provádění aplikace, včetně podrobného zpětného sledování v případě chyb. Nechybí ani protokolování a jednotkové testování.
Dokumentace aplikace Pyramid je vynikající. Kromě rychlého seznámení se základy a procházky ve stylu tutoriálu v ní najdete sadu výukových programů přispívaných komunitou a kuchařku běžných receptů. Ta obsahuje techniky nasazení pro řadu cílových prostředí, od Google App Engine po Nginx.
Pyramid podporuje Python 2 i Python 3, ale nepoužívá asynchronní syntaxi Pythonu 3.
Pyramid podporuje Python 2 i Python 3, ale nepoužívá asynchronní syntaxi Pythonu 3. Pokud chcete asynchronizaci v Pyramidu využít, podívejte se na projekt aiopyramid, který obsahuje lešení pro asynchronní aplikaci „hello world“.
Sanic
Sanic je navržen pro rychlost a jednoduchost, pracuje s Pythonem 3.6 nebo vyšším a používá syntaxi Pythonu async/await
(dostupnou od Pythonu 3.5), která vám umožní vytvářet efektivní webové aplikace.
Stejně jako u Flasku nebo Bottle, základní Sanic „hello world“ obsahuje asi 10 řádků kódu, z nichž většinu tvoří importy a další kotelní šablony. Hlavní rozdíl spočívá v tom, že trasy aplikace musí být deklarovány jako funkce async def
a k jejich vyvolání v rámci asynchronního kódu musíte použít await
. Pokud jste již někdy psali asynchronní aplikace, máte nejtěžší část již za sebou.
Mnoho mechanismů, které Sanic používá pro zpracování spojení a odpovědí, vám bude povědomých. Požadavky a odpovědi jsou jen objekty se známě vypadajícími vlastnostmi, jako jsou nahrané soubory, formuláře, objekty JSON, hlavičky a tak dále.
Aplikace s mnoha trasami se stávají těžkopádnými na správu. Sanic to řeší pomocí „blueprintů“, objektů, které mohou popisovat skupiny tras a umožňují jejich správu pomocí vysokoúrovňového rozhraní. Místo toho, abyste každou trasu psali explicitně nebo používali přehršel tras s proměnnými, můžete napsat několik blueprintů, které obecně popisují, jak trasy v aplikaci fungují (např. /object/object_id/action
). Blueprinty mohou mít společný middleware, což je užitečné, pokud chcete na některé trasy použít funkce správy, ale na jiné ne.
Sanic pracuje i s jinými protokoly než HTTP. Koncové body WebSocket vyžadují pouze jiný dekorátor a trochu více vnitřní logiky (např. čekání a zpracování odpovědí). Vlastní síťové protokoly lze podporovat podtřídou asyncio.protocol
.
Sanic záměrně vynechává funkce, jako je připojení k databázi a šablonování HTML, zatímco zachovává funkce, které by člověk použil k zapojení těchto schopností: middleware, centralizovanou konfiguraci aplikace atd.
Tornado
Tornado je další drobný framework zaměřený na specifický případ použití: asynchronní síťové aplikace. Tornado se dobře hodí pro vytváření služeb, které otevírají velké množství síťových spojení a udržují je při životě – tedy vše, co zahrnuje WebSockets nebo dlouhé dotazování. Tornado 6.0 vyžaduje Python 3.5 nebo vyšší a zcela opouští podporu Pythonu 2.
Stejně jako Bottle nebo Falcon, i Tornado vynechává funkce, které jsou pro jeho hlavní účel cizí. Tornado má vestavěný šablonovací systém pro generování HTML a dalších výstupů a poskytuje mechanismy pro internacionalizaci, zpracování formulářů, nastavení souborů cookie, ověřování uživatelů a ochranu CSRF. Vynechává však funkce, jako je validace formulářů a ORM, které jsou určeny především pro webové aplikace zaměřené na uživatele.
Tornado vyniká v poskytování infrastruktury aplikacím, které potřebují úzkou kontrolu nad asynchronní sítí. Tornado například poskytuje nejen vestavěný asynchronní server HTTP, ale také asynchronního klienta HTTP. Tornado se tak dobře hodí k vytváření aplikací, jako je například web scraper nebo bot, které se paralelně dotazují na jiné weby a jednají na základě vrácených dat.
Pokud chcete vytvořit aplikaci, která používá jiné protokoly než HTTP, Tornado vám poradí. Tornado poskytuje přístup k nízkoúrovňovým TCP spojením a soketům k nástrojům, jako jsou DNS resolvery, a také k autentizačním službám třetích stran a podporuje spolupráci s jinými frameworky prostřednictvím standardu WSGI. Dokumentace, která je sice malá, ale ne skoupá, obsahuje dostatek příkladů, jak toho všeho dosáhnout.
Tornado využívá a doplňuje nativní funkce jazyka Python pro asynchronní chování. Pokud používáte Python 3.5, Tornado podporuje vestavěná klíčová slova async
a await
, která slibují zvýšení rychlosti aplikací. Můžete také použít futures nebo zpětná volání pro zpracování reakcí na události.
Tornado poskytuje knihovnu synchronizačních primitiv – maphores, zámky a podobně – pro koordinaci událostí mezi asynchronními koroutiny. Všimněte si, že Tornado běží normálně jednovláknově, takže tato primitiva nejsou stejná jako jejich jmenovci ve vláknech. Pokud však chcete Tornado spustit v paralelních procesech a využít tak více soketů a jader, jsou k dispozici nástroje, které to umožňují.
Dokumentace Tornada pokrývá každý hlavní koncept frameworku a všechna hlavní API v modelu. Přestože obsahuje ukázkovou aplikaci (webový crawler), slouží hlavně k demonstraci modulu Tornado pro řazení do front.