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

Asynchronní programování je nyní v Pythonu prvotřídní občan. Pokud jste webový vývojář, existují úžasné frameworky, ze kterých si můžete vybrat!

V době psaní již asynchronní není jen módní slovo v komunitě Pythonu. S vydáním jeho asyncio knihovny ve verzi 3.5, Python uznal dopad Node.js na vývoj webu a zavedl do jazyka dvě nová klíčová slova – async a wait. To byl velmi velký problém, protože jazyk Python je extrémně opatrný při rozšiřování základní syntaxe, pokud to není naléhavá potřeba, což jen naznačuje, jak zásadně důležité považovali vývojáři Pythonu asynchronní schopnosti.

V důsledku toho byly otevřeny stavidla asynchronního programování: nové i staré knihovny začaly využívat funkci coroutines, asynchronní frameworky explodovaly v popularitě a nové se píší dodnes. Výkon na stejné úrovni nebo lepší než u Node.js není neslýchaný, a pokud vaše vzory načítání nezahrnují spoustu úloh náročných na CPU, není důvod, proč nemůžete provést několik tisíc požadavků za sekundu.

Ale dost motivace!

Pojďme prozkoumat současnou krajinu Pythonu a podívat se na některé z nejlepších asynchronních frameworků.

Table of Contents

Tornádo

Překvapivě, Tornádo není vůbec nový rámec. Jeho první vydání bylo v roce 2009 (přesně před deseti lety, jak jsem psala) a od té doby se zaměřuje na poskytování skálopevného asynchronního programování s vysokou souběžností.

Tornado v zásadě není webový framework. Je to kolekce asynchronních modulů, které se také používají k sestavení modulu webového rámce. 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 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á silné a oddané následovníky v komunitě Python a používají jej zkušení architekti k vytváření vysoce schopných systémů. Je to rámec, který již dlouho měl odpověď na problémy souběžnosti, ale možná se nestal mainstreamem, protože nepodporuje standard WSGI a byl příliš zakoupitelný (nezapomeňte, že většina knihoven Pythonu je stále synchronní ).

  Jak nahrát schůzku v Zoomu

Sanic

Sanic je „moderní“ framework v pravém slova smyslu: nepodporuje Python verze nižší než 3.6, podporuje jednoduchou a univerzální syntaxi async/await ihned po vybalení a v důsledku toho vás nenutí číst zátěže dokumentace a mějte na paměti okrajové případy, než budete moci napsat svůj první obslužný program HTTP.

Ve výsledku je výsledná syntaxe celkem příjemná (alespoň podle mě); podobá se kódu, který byste napsali s jakýmkoli jiným mikrorámcem (například Flask, CherryPy), jen s několika asynchronními vloženými:

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 nejoblíbenější asynchronní framework ve světě Pythonu. Má téměř všechny funkce, které byste pro své projekty chtěli – směrování, middleware, soubory cookie, verzování, plány, pohledy založené na třídách, statické soubory, streamování, sokety atd. – a co nenabízí hned po vybalení. — šablony, podpora databází, souborové I/O, fronty — lze přidat, protože asynchronních knihoven je k dnešnímu dni právě pro ně dostatek.

Vibora

Vibora je blízkým bratrancem Sanicu, až na to, že se zaměřuje na to, aby se stal nejrychlejším webovým serverem v Pythonu. Ve skutečnosti vás hned první návštěva jeho webu vítá rámcovým srovnáním:

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

I když je Vibora syntaxí a funkcemi srovnatelná se Sanicem (nebo možná dokonce o něco lepší, protože obsahuje oblíbené knihovny a věci jako šablony jsou k dispozici ihned po vybalení), 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 jste však výkonnostní narkoman, Vibora může plavat vaši loď. To znamená, že od psaní Vibora dělá úplné přepsání, aby se stala ještě rychlejší, a odkaz k jeho výkonové verzi říká, že je pod „těžkým vývojem“. Bude to zklamání pro ty, kteří si Viboru vzali dříve a brzy budou muset čelit přelomovým změnám, ale hej, v asynchronním světě Pythonu jsou teprve rané dny a nikdo neočekává, že věci budou stabilní.

  Jak používat Apple HomePod jako interkom

Kvart

Pokud vás baví vývoj ve Flasku, ale litujete nedostatku asynchronní podpory, užijete si to Kvart mnoho.

Quart je v souladu s ASGI standard, který je nástupcem slavného standardu WSGI a nabízí asynchronní podporu. Zajímavá věc na Quartu je, že je nejen podobný Flask, ale ve skutečnosti je kompatibilní s Flask API! Autor tohoto frameworku chtěl zachovat Flask pocit a jen do něj přidat podporu async, WebSockets a HTTP 2. Výsledkem je, že se můžete naučit Quart přímo z dokumentace Flask, 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()

Cítí se (téměř) přesně jako Flask, že?!

Vzhledem k tomu, že Quart je evolucí Flasku, jsou k dispozici všechny funkce ve Flasku: směrování, middleware, relace, šablony, plány a tak dále. Ve skutečnosti můžete dokonce použít rozšíření Flask přímo uvnitř Quartu. Jeden háček je, že je podporován pouze Python 3.7+, ale pokud nepoužíváte nejnovější verzi Pythonu, možná není asynchronní správná cesta. 🙂

Dokumentace je opravdu potřeba, pokud nemáte dřívější zkušenosti s Flaskem, ale mohu doporučit Quart, protože je to pravděpodobně jediný asynchronní rámec, který se brzy blíží k vydání 1.0.

FastAPI

Poslední (ale nejpůsobivější) framework na tomto seznamu je FastAPI. Ne, není to rámec pouze pro API; ve skutečnosti se zdá, že FastAPI je nejbohatší na funkce a dokumentaci, se kterým jsem se setkal při zkoumání asynchronních rámců Pythonu.

Je zajímavé poznamenat, že autor frameworku do hloubky prostudoval několik dalších frameworků, od těch současných, jako je Django, po moderní, jako je Sanic, a také se podíval napříč technologiemi do NestJS (webový framework Node.js, Typescript). Lze číst jejich vývojovou filozofii a rozsáhlá srovnání tady.

Syntaxe je docela příjemná; lze dokonce tvrdit, že je to mnohem příjemnější než jiné rámce, se kterými jsme se setkali:

rom 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 zabijáckých funkcí, díky kterým FastAPI převyšuje ostatní rámce:

  Jak zjistit, zda někdo zkontroloval vaši polohu na Snapchatu

Automatické generování dokumentů API: Jakmile jsou vaše koncové body napsány, můžete hrát s rozhraním API pomocí uživatelského rozhraní vyhovujícího standardům. Podporovány jsou SwaggerUI, ReDoc a další.

Rámec také provádí automatickou dokumentaci datového modelu pomocí schématu JSON.

Moderní vývoj: Ano, slovo „moderní“ se často skloňuje, ale našel jsem FastAPI, aby promluvil. Dependency Injection a typ hinting jsou prvotřídní občané, kteří prosazují nejen dobré zásady kódování, ale z dlouhodobého hlediska předcházejí chybám a zmatkům.

Rozsáhlá dokumentace: Nevím jak vy, ale já jsem na dobrou dokumentaci totální blázen. A v této oblasti FastAPI vítězí. Má stránky za stránkami dokumentů, které vysvětlují téměř každou malou jemnost a „pozor! okamžiky pro vývojáře všech úrovní. V těchto dokumentech cítím jasné „srdce a duši“ a jediné srovnání, které mohu najít, jsou dokumenty Django (ano, dokumenty FastAPI jsou tak dobré!).

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

A co výkon? FastAPI je postaveno na úžasné knihovně Starlette, což vede k výkonu, který odpovídá Node a v některých případech dokonce Go! Celkově vzato mám opravdu pocit, že FastAPI bude závodit vpřed jako nejlepší asynchronní framework pro Python.

Závěr

V asynchronním prostředí Pythonu se toho v těchto dnech hodně děje. Objevují se nové rámce, staré se přepisují a vyvíjejí se knihovny, aby odpovídaly asynchronnímu chování. I když má Python vestavěnou podporu pro smyčku událostí a je možné, aby byly části vaší aplikace asynchronní, můžete se rozhodnout, že půjdete all-in a budete stavět na jednom z rámců zde. Nezapomeňte mít na paměti dlouhodobé: několik asynchronních rámců Pythonu je v raných fázích a rychle se vyvíjejí, což poškodí váš vývojový proces a zvýší obchodní náklady. Opatrnost je klíčová!

Ale vše řečeno a hotovo; Python je produkčně připravený poskytovat nenáročný výkon, pokud jde o webové rámce. Pokud jste tak dlouho přemýšleli o migraci na Node, nyní už nemusíte! 🙂

Zní to dobře? Master Python dnes!