5 најбољих асинхроних веб оквира за Питхон

Преглед садржаја

Asinhrono programiranje je sada integralni deo Pythona. Ukoliko se bavite web razvojem, imate na raspolaganju izvanredne framework-e!

Kada je reč o praktičnoj primeni, asinhronost nije više samo popularna tema u Python zajednici. Lansiranjem
asyncio
biblioteke u verziji 3.5, Python je prepoznao uticaj Node.js-a na web razvoj. Uvedene su dve nove ključne reči u jezik – async i await. Ovo je bio značajan korak, s obzirom na to da Python veoma oprezno proširuje svoju osnovnu sintaksu, osim u slučaju hitne potrebe. Ovaj potez pokazuje koliko su programeri Pythona smatrali asinhronu funkcionalnost ključnom.

Kao rezultat toga, otvorena su vrata za asinhrono programiranje: nove i stare biblioteke počele su da koriste funkciju korutina, asinhroni framework-i su doživeli eksploziju popularnosti, a novi se i dalje razvijaju. Performanse koje pariraju ili su bolje od Node.js-a nisu neuobičajene, i ukoliko vaše aplikacije ne uključuju veliki broj zadataka koji su zahtevni za CPU, nema razloga zašto ne biste mogli da obradite nekoliko hiljada zahteva u sekundi.

Ali, dosta o motivaciji!

Hajde da istražimo trenutnu Python scenu i pogledamo neke od najboljih asinhronih framework-a.

Tornado

Iznenadjujuće,
Tornado
uopšte nije nov framework. Prva verzija je objavljena 2009. godine, a od tada je njegov fokus na pružanju robustnog asinhronog programiranja sa visokim nivoom konkurentnosti.

Tornado u suštini nije web framework. To je kolekcija asinhronih modula, koji se koriste za izgradnju modula web framework-a. Konkretno, ovi moduli su:

  • Korutine i drugi primitivi (tornado.gen, tornado.locks, tornado.queues, itd.)
  • Mrežni moduli (tornado.ioloop, tornado.iostream, itd.)
  • Asinhroni serveri i klijenti (tornado.httpserver, tornado.httpclient, itd.)

Ovi moduli su kombinovani da bi se dobili finalni moduli framework-a: tornado.web, tornado.routing, tornado.template, itd.

  
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 ima snažnu i posvećenu zajednicu u Python svetu i koristi se od strane iskusnih arhitekata za izgradnju visokokvalitetnih sistema. To je framework koji dugo vremena nudi rešenja za probleme konkurentnosti, ali možda nije postao mejnstrim jer ne podržava WSGI standard i bio je preveliki zalogaj za korišćenje (imajte na umu da je većina Python biblioteka još uvek sinhrona).

Sanic

Sanic
je „moderan“ framework u pravom smislu te reči: ne podržava Python verzije starije od 3.6, podržava jednostavnu i univerzalnu async/await sintaksu i, kao rezultat toga, ne zahteva od vas da proučavate dokumentaciju i pamtite sve specifične slučajeve pre nego što napišete svoj prvi HTTP hendler.

Kao rezultat toga, rezultujuća sintaksa je prilično prijatna; podseća na kod koji biste napisali sa bilo kojim drugim mikroframework-om (Flask, CherryPy, na primer) sa samo nekoliko dodatnih reči async:

  
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 verovatno najpopularniji i najomiljeniji asinhroni framework u Python zajednici. Sadrži skoro sve funkcionalnosti koje su vam potrebne za vaše projekte — rutiranje, middleware, kolačiće, verzije, nacrte, poglede bazirane na klasama, statičke fajlove, strimovanje, sokete, itd. — a one funkcionalnosti koje ne nudi „out-of-the-box“ — šablone, podrška za bazu podataka, fajl I/O, redovi — mogu se dodati, jer sada postoji dovoljno asinhronizovanih biblioteka za njih.

Vibora

Vibora
je bliski rođak Sanic-a, ali je fokusiran na to da postane najbrži Python web server. U stvari, prva stvar koju vidite na njihovoj web stranici je uporedna tabela framework-a:

Kao što vidite, Vibora tvrdi da je nekoliko puta brža od klasičnih framework-a i više nego duplo brža od Sanic-a, svog najbližeg konkurenta. Naravno, ove podatke treba uzeti sa rezervom. 🙂

Iako je po sintaksi i funkcionalnostima Vibora uporediva sa Sanic-om (ili možda čak i malo bolja jer objedinjuje popularne biblioteke i stvari poput šablona su dostupne odmah), smatrao bih Sanic zrelijim, jer postoji duže i ima veću zajednicu.

  
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)
  
  

Međutim, ako su performanse vaš prioritet, Vibora bi mogla biti pravi izbor. Ipak, Vibora trenutno prolazi kroz ozbiljne prepravke kako bi postala još brža, i link koji vodi ka njihovoj stranici sa informacijama o performansama kaže da je u „intenzivnom razvoju“. Ovo može biti razočarenje za one koji su ranije prihvatili Viboru i uskoro će se suočiti sa ozbiljnim promenama, ali hej, rani su dani u Python async svetu i niko ne očekuje da će stvari biti stabilne.

Quart

Ako volite da razvijate aplikacije u Flask-u, ali vam nedostaje asinhrona podrška, onda će vam se
Quart
veoma svideti.

Quart je u skladu sa
ASGI
standardom, koji je naslednik poznatog WSGI standarda i nudi asinhronu podršku. Zanimljivo kod Quart-a je to što nije samo sličan Flask-u, već je i usaglašen sa Flask API-jem! Autor ovog framework-a je želeo da zadrži osećaj Flask-a i samo doda podršku za asinhronizaciju, WebSocket-e i HTTP 2. Kao rezultat toga, Quart možete naučiti direktno iz Flask dokumentacije, samo imajte na umu da su funkcije u Quart-u asinhrone.

  
from quart import Quart

app = Quart(__name__)

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

app.run()
  
  

Deluje (skoro) isto kao i Flask, zar ne?!

Pošto je Quart evolucija Flask-a, dostupne su sve funkcionalnosti unutar Flask-a: rutiranje, middleware, sesije, šabloni, nacrti, itd. Zapravo, možete čak koristiti ekstenzije Flask-a direktno unutar Quart-a. Jedina mana je da je podržan samo Python 3.7+, ali ako ne koristite najnoviju verziju Pythona, možda asinhronizacija nije pravi put za vas. 🙂

Dokumentacija je zaista potrebna ako nemate prethodno iskustvo sa Flask-om, ali svakako mogu da preporučim Quart, jer je verovatno jedini asinhroni framework koji se uskoro približava verziji 1.0.

FastAPI

Poslednji (ali najimpresivniji) framework na ovoj listi je
FastAPI. Ne, ovo nije framework samo za API; zapravo, čini se da je FastAPI framework sa najviše funkcija i najboljom dokumentacijom na koju sam naišao dok sam istraživao asinhronizovane Python framework-e.

Zanimljivo je da je autor framework-a detaljno proučio nekoliko drugih framework-a, od savremenih kao što je Django do modernih kao što je Sanic, kao i tehnologije u NestJS (Node.js, TypeScript web framework). Možete pročitati njihovu razvojnu filozofiju i sveobuhvatna poređenja
ovde.

Sintaksa je prilično prijatna; može se čak reći da je mnogo prijatnija od drugih framework-a koje smo do sada analizirali:

  
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 sada, lista „killer“ funkcija koje čine da FastAPI nadmaši druge framework-e:

Automatska generacija API dokumenata: Čim su vaše krajnje tačke napisane, možete se igrati sa API-jem pomoću korisničkog interfejsa koji je u skladu sa standardima. Podržani su SwaggerUI, ReDoc i drugi.

Framework takođe automatski generiše dokumentaciju modela podataka sa JSON šemom.

Savremeni razvoj: Da, reč „moderno“ se često koristi, ali otkrio sam da FastAPI zaista opravdava taj epitet. Injekcija zavisnosti i anotacije tipova su prvoklasne funkcionalnosti, koje ne samo da implementiraju dobre principe kodiranja, već i sprečavaju greške i konfuziju na duže staze.

Obimna dokumentacija: Ne znam za vas, ali ja sam veliki ljubitelj dobre dokumentacije. I u ovoj oblasti FastAPI briljira. Ima stranice i stranice dokumentacije koja objašnjava skoro svaku malu suptilnost i upozorava na potencijalne probleme programere svih nivoa. Oseća se da je uloženo puno „srca i duše“ u dokumente, a jedino poređenje koje mi pada na pamet su Django dokumenti (da, FastAPI dokumenti su toliko dobri!).

Više od osnova: FastAPI ima podršku za WebSocket-e, strimovanje, kao i GraphQL, pored svih tradicionalnih pomoćnih funkcija kao što su CORS, sesije, kolačići i tako dalje.

A šta je sa performansama? Pa, FastAPI je izgrađen na izvanrednoj Starlette biblioteci, što rezultira performansama koje su jednake Node-u, a u nekim slučajevima čak i Go-u! Sve u svemu, zaista imam osećaj da će FastAPI postati vrhunski asinhroni framework za Python.

Zaključak

Mnogo toga se dešava u Python asinhronoj sferi ovih dana. Pojavljuju se novi framework-i, stari se prepravljaju, a biblioteke se razvijaju kako bi podržale asinhrono ponašanje. Iako Python ima ugrađenu podršku za event loop i moguće je da delove vaše aplikacije učinite asinhronim, možete se odlučiti da sve uradite odjednom i izgradite aplikaciju pomoću jednog od ovde navedenih framework-a. Samo imajte na umu dugoročnu perspektivu: nekoliko Python asinhronih framework-a je u ranim fazama i brzo se razvijaju, što može negativno uticati na vaš razvojni proces i povećati troškove. Oprez je ključan!

Ali, sve u svemu, Python je spreman za produkciju i može da pruži odlične performanse kada je reč o web framework-ima. Ako ste razmišljali o prelasku na Node, sada više ne morate! 🙂

Zvuči dobro?
Usavršite Python danas!