Top 5 cadre web asincrone pentru Python

Programarea asincronă este un cetățean de primă clasă în Python acum. Dacă sunteți un dezvoltator web, există cadre uimitoare din care puteți alege!

În momentul în care scriem, asincron nu mai este doar un cuvânt la modă în comunitatea Python. Odată cu lansarea lui asincron bibliotecă în versiunea 3.5, Python a recunoscut impactul Node.js asupra dezvoltării web și a introdus două cuvinte cheie noi în limbaj – async și await. Aceasta a fost o afacere foarte mare, deoarece limbajul Python este extrem de precaut în a extinde sintaxa de bază, cu excepția cazului în care există o nevoie presantă, ceea ce indică doar cât de importante au considerat dezvoltatorii Python capabilitățile asincrone.

Ca urmare, au fost deschise porțile programării asincrone: bibliotecile noi și vechi au început să folosească funcția coroutines, cadrele asincrone au explodat în popularitate și altele noi sunt încă în curs de scris astăzi. Performanța la egalitate sau mai bună decât cea a lui Node.js nu este nemaiauzită și, cu excepția cazului în care tiparele dvs. de încărcare implică o mulțime de sarcini grele CPU, nu există niciun motiv pentru care să nu puteți face câteva mii de solicitări pe secundă.

Dar destulă motivație!

Să examinăm peisajul actual Python și să vedem unele dintre cele mai bune cadre asincrone.

Tornadă

În mod surprinzător, Tornadă nu este deloc un cadru nou. Lansarea sa inițială a fost în 2009 (în urmă cu exact zece ani, la momentul scrierii) și de atunci, concentrarea sa s-a concentrat pe furnizarea de programare asincronă solidă cu concurență ridicată.

Tornado nu este, în principiu, un cadru web. Este o colecție de module asincrone, care sunt, de asemenea, folosite pentru a construi modulul cadru web. Mai precis, aceste module sunt:

  • Coroutine și alte primitive (tornado.gen, tornado.locks, tornado.queues etc.)
  • Module de rețea (tornado.ioloop, tornado.iostream etc.)
  • Servere și clienți asincroni (tornado.httpserver, tornado.httpclient etc.)

Acestea au fost combinate pentru a produce modulele cadru finale: tornado.web, tornado.routing, tornado.template etc.

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 are o mulțime puternică și devotată în comunitatea Python și este folosit de arhitecți experimentați pentru a construi sisteme de înaltă capacitate. Este un cadru care are de multă vreme răspunsul la problemele concurenței, dar poate că nu a devenit mainstream, deoarece nu acceptă standardul WSGI și a fost prea mult acceptat (rețineți că cea mai mare parte a bibliotecilor Python sunt încă sincrone ).

  8 programe de afiliere API Dezvoltatorii se pot alătura pentru a face bani

Sanic

Sanic este un cadru „modern” în adevăratul sens al cuvântului: nu acceptă versiunea Python sub 3.6, acceptă sintaxa simplă și universală async/wait din cutie și, ca rezultat, nu te face să citești încărcături de documentație și păstrați cazurile marginale în minte înainte de a putea scrie primul dvs. handler HTTP.

Drept urmare, sintaxa rezultată este destul de plăcută (cel puțin după părerea mea); seamănă cu codul pe care l-ați scrie cu orice alt microcadru (Flask, CherryPy, de exemplu) cu doar câteva asincrone presărate:

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 este, fără îndoială, cel mai popular și mai iubit cadru asincron din lumea Python. Are aproape toate caracteristicile pe care le-ai dori pentru proiectele tale – rutare, middleware, cookie-uri, versiuni, planuri, vizualizări bazate pe clasă, fișiere statice, streaming, socket-uri etc. – și ceea ce nu oferă din cutie — șabloane, suport pentru baze de date, fișiere I/O, cozi — pot fi adăugate, deoarece există suficiente biblioteci asincrone pentru acestea începând de astăzi.

Vibora

Vibora este un văr apropiat al lui Sanic, cu excepția faptului că este fixat să devină cel mai rapid server web Python de acolo. De fapt, prima vizită a site-ului său web vă întâmpină cu o comparație a cadrului:

După cum puteți vedea, Vibora pretinde că este de câteva ori mai rapid decât cadrele clasice și este de peste două ori mai rapid decât Sanic, cel mai apropiat concurent al său. Desigur, reperele trebuie luate cu un grăunte de sare. 🙂

Deși în sintaxă și funcții, Vibora este comparabil cu Sanic (sau poate chiar puțin mai bine, deoarece reunește biblioteci populare și lucruri precum șabloane sunt disponibile din cutie), aș considera Sanic mai matur, deoarece este de mai mult timp și are o comunitate mai mare.

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)

Totuși, dacă ești un drogat de performanță, Vibora s-ar putea să-ți plutească barca. Acestea fiind spuse, în momentul scrierii, Vibora nu face o rescrie completă pentru a deveni și mai rapidă, iar legătură la versiunea sa de performanță spune că se află în „dezvoltare grea”. Va fi o dezamăgire pentru cei care au preluat Vibora mai devreme și în curând vor trebui să se confrunte cu schimbări radicale, dar hei, sunt primele zile în lumea asincronă Python și nimeni nu se așteaptă ca lucrurile să fie stabile.

  Cum să gestionați rapid vizualizarea divizată pe Mac

Quart

Dacă vă place să dezvoltați în Flask, dar regretați lipsa suportului asincron, vă veți bucura Quart mult.

Quart este în conformitate cu ASGI standard, care este un succesor al faimosului standard WSGI și oferă suport asincron. Lucrul interesant despre Quart este că nu este doar similar cu Flask, dar este de fapt compatibil cu API-ul Flask! Autorul acestui cadru a vrut să păstreze senzația Flask și să adauge doar suport asincron, WebSockets și HTTP 2. Drept urmare, puteți învăța Quart chiar din documentația Flask, ținând cont de faptul că funcțiile din Quart sunt asincrone.

from quart import Quart

app = Quart(__name__)

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

app.run()

Se simte (aproape) exact ca Flask, nu-i așa?!

Deoarece Quart este o evoluție a Flask, toate caracteristicile din interiorul Flask sunt disponibile: rutare, middleware, sesiuni, șabloane, planuri și așa mai departe. De fapt, puteți folosi chiar și extensiile Flask direct în Quart. O problemă este că Python 3.7+ este acceptat doar, dar, atunci, dacă nu rulați cea mai recentă versiune de Python, poate că asincron nu este calea corectă. 🙂

Documentația este foarte necesară dacă nu aveți experiență anterioară cu Flask, dar vă pot recomanda Quart, deoarece este probabil singurul cadru asincron care se apropie de lansarea sa 1.0 în curând.

FastAPI

Ultimul (dar cel mai impresionant) cadru din această listă este FastAPI. Nu, nu este un cadru numai API; de fapt, FastAPI pare să fie cel mai bogat în funcții și documentație cadru pe care l-am întâlnit când am căutat cadre Python asincrone.

Este interesant de observat că autorul cadrului a studiat în profunzime câteva alte cadre, de la cele contemporane precum Django până la cele moderne precum Sanic, precum și analizând tehnologiile în NestJS (un cadru web Node.js, Typescript). Filosofia lor de dezvoltare și comparații extinse pot fi citite Aici.

Sintaxa este destul de plăcută; se poate chiar argumenta că este mult mai plăcut decât celelalte cadre pe care le-am întâlnit:

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}

Și acum, lista de caracteristici ucigașe care fac FastAPI să eclipseze alte cadre:

  8 instrumente de răspuns predefinite pentru a ajuta productivitatea și serviciul pentru clienți

Generare automată de documente API: de îndată ce punctele finale au fost scrise, vă puteți juca cu API folosind o interfață de utilizare conformă cu standardele. SwaggerUI, ReDoc și altele sunt acceptate.

Cadrul face, de asemenea, documentarea automată a modelului de date cu schema JSON.

Dezvoltare modernă: Da, cuvântul „modern” este răspândit de multe ori, dar am găsit că FastAPI de fapt își spune cuvântul. Injecția de dependență și indicarea tipului sunt cetățeni de primă clasă, punând în aplicare nu doar principiile bune de codare, dar prevenind erorile și confuzia pe termen lung.

Documentare extinsă: nu știu despre tine, dar sunt un nebun de documentare bună. Și în acest domeniu, FastAPI câștigă fără îndoială. Are pagini peste pagini de documente care explică aproape fiecare subtilitate și „ai grijă!” momente pentru dezvoltatori de toate nivelurile. Simt un „inimă și suflet” clar în documentele de aici, iar singura comparație pe care o pot găsi este documentele Django (da, documentele FastAPI sunt atât de bune!).

Dincolo de elementele de bază: FastAPI are suport pentru WebSockets, Streaming, precum și GraphQL, pe lângă faptul că are toți ajutoarele tradiționale precum CORS, sesiuni, cookie-uri și așa mai departe.

Și cum rămâne cu performanța? Ei bine, FastAPI este construit pe uimitoarea bibliotecă Starlette, rezultând o performanță care se potrivește cu Node și, în unele cazuri, chiar Go! Una peste alta, chiar am senzația că FastAPI va merge înainte ca cadru asincron de top pentru Python.

Concluzie

Se întâmplă multe în peisajul asincron Python în aceste zile. Apar noi cadre, cele vechi sunt rescrise și bibliotecile sunt dezvoltate pentru a se potrivi cu comportamentul asincron. În timp ce Python are suport încorporat pentru o buclă de evenimente și este posibil să faci părți din aplicația ta asincrone, poți alege să faci all-in și să construiești pe unul dintre cadrele de aici. Asigurați-vă că aveți în vedere termenul lung: câteva dintre cadrele asincrone Python existente sunt în stadii incipiente și sunt în curs de evoluție rapidă, ceea ce vă va afecta procesul de dezvoltare și va crește costurile de afaceri. Atenția este cheia!

Dar toate spuse și făcute; Python este pregătit pentru producție pentru a oferi performanțe luminoase atunci când vine vorba de cadre web. Dacă de atâta timp te gândești să migrați la Node, acum nu mai este nevoie! 🙂

Suna bine? Master Python astăzi!