Top 5 asynchronních webových rámců pro Python

Asynchronní programování se stalo nedílnou součástí Pythonu. Pro vývojáře webových aplikací je k dispozici široká škála vynikajících frameworků.

V současnosti už asynchronní zpracování není jen módním trendem v komunitě Pythonu. Se zavedením knihovny asyncio ve verzi 3.5, Python zareagoval na vliv Node.js na webový vývoj a přidal do jazyka dvě nová klíčová slova – async a await. Tento krok byl významný, protože Python je velmi opatrný při rozšiřování své základní syntaxe, pokud to není nezbytně nutné. To jen podtrhuje, jak zásadní význam přikládali vývojáři Pythonu asynchronním schopnostem.

V důsledku toho se rozvinulo asynchronní programování. Nové i stávající knihovny začaly využívat funkce coroutines, popularita asynchronních frameworků prudce vzrostla a dodnes se vytvářejí nové. Výkon srovnatelný nebo lepší než u Node.js není výjimkou, a pokud vaše úlohy nezahrnují mnoho operací náročných na procesor, můžete bez problémů zvládnout tisíce požadavků za sekundu.

Ale dost o motivaci!

Pojďme prozkoumat aktuální situaci v Pythonu a podívat se na některé z nejlepších asynchronních frameworků.

Tornado

Překvapivě, Tornado není žádný nováček. Jeho první vydání proběhlo už v roce 2009 a od té doby se zaměřuje na poskytování spolehlivého asynchronního programování s vysokou mírou souběžnosti.

Tornado není primárně webový framework. Je to spíše kolekce asynchronních modulů, které se používají k vytvoření modulu webového frameworku. Konkrétně se jedná o tyto moduly:

  • Coroutines a další primitiva (tornado.gen, tornado.locks, tornado.queues atd.)
  • Síťové moduly (tornado.ioloop, tornado.iostream atd.)
  • Asynchronní servery a klienti (tornado.httpserver, tornado.httpclient atd.)

Tyto moduly byly zkombinovány a vytvořily finální moduly frameworku: tornado.web, tornado.routing, tornado.template atd.

import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
    ])

if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

Tornado má silnou a oddanou komunitu a zkušení architekti jej používají k vytváření robustních systémů. Je to framework, který už dlouho nabízí řešení problémů se souběžností, ale možná se nestal mainstreamem, protože nepodporuje standard WSGI a je příliš specifický. (Nezapomeňte, že většina knihoven Pythonu je stále synchronní.)

Sanic

Sanic je „moderní“ framework v pravém smyslu slova. Nepodporuje verze Pythonu nižší než 3.6, nabízí jednoduchou a univerzální syntaxi async/await ihned po instalaci a díky tomu se nemusíte ztrácet v rozsáhlé dokumentaci a řešit okrajové případy, než napíšete svůj první HTTP handler.

Výsledná syntaxe je celkem příjemná; připomíná kód, který byste psali s jiným mikrorámcem (např. Flask, CherryPy), jen s několika asynchronními vložkami:

from sanic import Sanic
from sanic.response import json

app = Sanic()

@app.route("/")
async def test(request):
    return json({"hello": "world"})

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8000)

Sanic je pravděpodobně nejoblíbenější a nejuznávanější asynchronní framework v Pythonu. Disponuje téměř všemi funkcemi, které byste pro své projekty mohli potřebovat – směrování, middleware, cookies, verzování, plánování, pohledy založené na třídách, statické soubory, streamování, sockety atd. A to, co nenabízí ihned, lze snadno doinstalovat, protože je k dispozici dostatek asynchronních knihoven pro šablony, databáze, I/O operace se soubory, fronty a podobně.

Vibora

Vibora je blízký příbuzný Sanicu, s tím rozdílem, že se zaměřuje na to, aby se stal nejrychlejším webovým serverem v Pythonu. Hned na úvodní stránce jeho webu najdete srovnání výkonnosti s jinými frameworky:

Jak je vidět, Vibora tvrdí, že je mnohonásobně rychlejší než klasické frameworky a více než dvakrát rychlejší než Sanic, jeho nejbližší konkurent. Benchmarky je samozřejmě třeba brát s rezervou. 🙂

Přestože se Vibora syntaxí a funkcemi podobá Sanicu (nebo je možná i o něco lepší, protože obsahuje oblíbené knihovny a funkce jako šablonování jsou dostupné ihned), považoval bych Sanic za vyspělejší, protože existuje déle a má větší komunitu.

from vibora import Vibora, JsonResponse

app = Vibora()

@app.route('/')
async def home():
    return JsonResponse({'hello': 'world'})

if __name__ == '__main__':
    app.run(host="0.0.0.0", port=8000)

Pokud však toužíte po maximálním výkonu, Vibora by mohla být pro vás tou pravou volbou. Je třeba poznamenat, že Vibora prochází kompletním přepsáním, aby se ještě více zrychlila a dle informací o její výkonové verzi, je stále ve vývoji. Ti, kteří s Viborou začali dříve, se tak brzy mohou dočkat zásadních změn. Ale tak už to v asynchronním světě Pythonu chodí, jsme teprve na začátku a nikdo neočekává, že věci budou stabilní.

Quart

Pokud jste si oblíbili vývoj ve Flasku, ale chybí vám asynchronní podpora, budete si Quart užívat.

Quart je v souladu se standardem ASGI, který je nástupcem standardu WSGI a nabízí asynchronní podporu. Zajímavostí Quartu je, že se nejen podobá Flasku, ale je také kompatibilní s jeho API! Autor tohoto frameworku chtěl zachovat charakter Flasku a pouze do něj přidat podporu async, WebSockets a HTTP 2. V důsledku toho se můžete Quart naučit přímo z dokumentace Flasku, jen mějte na paměti, že funkce v Quartu jsou asynchronní.

from quart import Quart

app = Quart(__name__)

@app.route('/')
async def hello():
    return 'hello'

app.run()

Připomíná vám to Flask, že?!

Protože je Quart evolucí Flasku, jsou v něm dostupné všechny jeho funkce: směrování, middleware, relace, šablony, plánování a tak dále. Můžete dokonce použít i rozšíření Flasku přímo v Quartu. Jediným zádrhelem je, že podporuje pouze Python 3.7+, ale pokud nepoužíváte nejnovější verzi Pythonu, možná není asynchronní programování pro vás to pravé. 🙂

Dokumentace je nezbytná, pokud nemáte předchozí zkušenosti s Flaskem, ale můžu Quart doporučit, protože je pravděpodobně jediný asynchronní framework, který se brzy dočká vydání verze 1.0.

FastAPI

Posledním (ale nejvíce působivým) frameworkem na tomto seznamu je FastAPI. Není to jen framework pro API; zdá se, že FastAPI je nejbohatší na funkce a dokumentaci ze všech asynchronních frameworků Pythonu, které jsem zkoumal.

Zajímavé je, že autor frameworku podrobně prostudoval několik dalších frameworků, od současných, jako je Django, po moderní, jako je Sanic, a podíval se také na technologie jako NestJS (webový framework pro Node.js v Typescriptu). Jejich filozofii vývoje a rozsáhlá srovnání si můžete přečíst zde.

Syntaxe je velmi příjemná; dokonce bych řekl, že příjemnější než u ostatních frameworků, které jsme zde zmínili:

from fastapi import FastAPI

app = FastAPI()

@app.get("/users/me")
async def read_user_me():
    return {"user_id": "the current user"}

@app.get("/users/{user_id}")
async def read_user(user_id: str):
    return {"user_id": user_id}

A nyní seznam klíčových funkcí, díky kterým FastAPI vyniká nad ostatními frameworky:

Automatické generování API dokumentace: Jakmile máte napsané koncové body, můžete s API komunikovat pomocí uživatelského rozhraní, které splňuje standardy. Jsou podporovány SwaggerUI, ReDoc a další.

Framework také automaticky dokumentuje datový model pomocí schématu JSON.

Moderní vývoj: Ano, slovo „moderní“ se používá často, ale myslím, že u FastAPI to platí. Dependency Injection a typové anotace jsou zde na prvním místě, což podporuje nejen správné zásady kódování, ale z dlouhodobého hlediska také předchází chybám a zmatkům.

Rozsáhlá dokumentace: Nevím jak vy, ale já jsem velký fanda dobré dokumentace. A v této oblasti FastAPI exceluje. Nabízí stránky a stránky dokumentace, která vysvětluje téměř každý detail a potenciální problém pro vývojáře všech úrovní. V těchto dokumentech cítím obrovské úsilí a jediné srovnání, které mě napadá, je s dokumentací Djangem (ano, dokumentace FastAPI je tak dobrá!).

Nad rámec základů: FastAPI má kromě tradičních pomocníků, jako jsou CORS, relace, cookies a tak dále, podporu pro WebSockets, Streamování a také GraphQL.

A co výkon? FastAPI je postaveno na výborné knihovně Starlette, což zajišťuje výkon srovnatelný s Node a v některých případech dokonce s Go! Celkově mám pocit, že FastAPI bude nejlepším asynchronním frameworkem pro Python.

Závěr

V asynchronním prostředí Pythonu se toho v dnešní době hodně děje. Objevují se nové frameworky, staré se přepisují a vyvíjejí se knihovny, aby podporovaly asynchronní chování. I když Python má vestavěnou podporu pro event loop a části vaší aplikace mohou být asynchronní, můžete se rozhodnout využít jeden z frameworků. Nezapomeňte ale myslet i do budoucna: některé asynchronní frameworky Pythonu jsou v rané fázi a rychle se vyvíjejí, což může zkomplikovat vývoj a zvýšit náklady. Opatrnost je klíčová!

Ale v konečném důsledku je Python připraven poskytovat špičkový výkon v oblasti webových frameworků. Pokud jste dlouho uvažovali o přechodu na Node, už nemusíte! 🙂

Zní to dobře? Zdokonalte si své znalosti Pythonu ještě dnes!