5 najlepszych asynchronicznych frameworków internetowych dla Pythona

Programowanie asynchroniczne jest teraz pierwszorzędnym obywatelem w Pythonie. Jeśli jesteś programistą internetowym, możesz wybierać spośród niesamowitych frameworków!

W momencie pisania, asynchroniczny nie jest już tylko modnym hasłem w społeczności Pythona. Wraz z wydaniem jego asyncjo w wersji 3.5 Python docenił wpływ Node.js na tworzenie stron internetowych i wprowadził do języka dwa nowe słowa kluczowe — async i await. To była bardzo ważna sprawa, ponieważ język Python jest bardzo ostrożny w rozszerzaniu podstawowej składni, chyba że istnieje pilna potrzeba, co tylko wskazuje, jak fundamentalnie ważne są dla programistów Pythona możliwości asynchroniczne.

W rezultacie otwarto wrota programowania asynchronicznego: nowe i stare biblioteki zaczęły korzystać z funkcji współprogramów, asynchroniczne frameworki zyskały na popularności, a nowe wciąż powstają. Wydajność porównywalna lub lepsza niż Node.js nie jest niespotykana, a jeśli twoje wzorce ładowania nie obejmują wielu zadań obciążających procesor, nie ma powodu, dla którego nie możesz wykonać kilku tysięcy żądań na sekundę.

Ale wystarczy motywacji!

Przyjrzyjmy się obecnemu krajobrazowi Pythona i sprawdźmy niektóre z najlepszych asynchronicznych frameworków.

Spis treści:

Tornado

Zaskakująco, Tornado nie jest w ogóle nowym frameworkiem. Jego pierwsze wydanie miało miejsce w 2009 roku (dokładnie dziesięć lat temu, w momencie pisania) i od tego czasu koncentruje się na zapewnieniu solidnego programowania asynchronicznego z wysoką współbieżnością.

Tornado zasadniczo nie jest frameworkiem internetowym. Jest to zbiór modułów asynchronicznych, które są również wykorzystywane do budowy modułu webowego frameworka. Mówiąc dokładniej, te moduły to:

  • Współprogramy i inne prymitywy (tornado.gen, tornado.locks, tornado.queues, itp.)
  • Moduły sieciowe (tornado.ioloop, tornado.iostream itp.)
  • Serwery i klienty asynchroniczne (tornado.httpserver, tornado.httpclient itp.)

Zostały one połączone w celu stworzenia ostatecznych modułów frameworka: tornado.web, tornado.routing, tornado.template, itp.

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 ma silną i zaangażowaną społeczność w społeczności Pythona i jest używany przez doświadczonych architektów do budowania wysoce wydajnych systemów. Jest to framework, który od dawna ma rozwiązanie na problemy ze współbieżnością, ale być może nie stał sięgłówny, ponieważ nie obsługuje standardu WSGI i był zbyt dużym zainteresowaniem (należy pamiętaćże większość bibliotek Pythona jest nadal synchroniczna ).

Sanic

Sanic jest „nowoczesnym” frameworkiem w prawdziwym tego słowa znaczeniu: nie obsługuje wersji Pythona poniżej 3.6, obsługuje prostą i uniwersalną składnię async/await od razu po wyjęciu z pudełka, dzięki czemu nie zmusza do czytania ładunków dokumentacji i pamiętaj o skrajnych przypadkach, zanim będziesz mógł napisać swój pierwszy program obsługi HTTP.

W rezultacie otrzymana składnia jest całkiem przyjemna (przynajmniej moim zdaniem); przypomina kod, który napisałbyś z dowolnym innym mikroframeworkiem (na przykład Flask, CherryPy) z kilkoma dodanymi asynchronicznymi:

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 jest prawdopodobnie najpopularniejszym i najbardziej lubianym frameworkiem asynchronicznym w świecie Pythona. Ma prawie wszystkie funkcje, których potrzebujesz dla swoich projektów — routing, oprogramowanie pośredniczące, pliki cookie, wersjonowanie, plany, widoki oparte na klasach, pliki statyczne, przesyłanie strumieniowe, gniazda itp. — i to, czego nie oferuje po wyjęciu z pudełka — szablony, obsługa baz danych, operacje we/wy plików, kolejki — można dodać, ponieważ na dzień dzisiejszy jest wystarczająco dużo bibliotek asynchronicznych.

Wibora

Wibora jest bliskim kuzynem Sanica, z wyjątkiem tego, że skupia się na tym, aby stać się najszybszym serwerem WWW w Pythonie. W rzeczywistości już przy pierwszej wizycie na jego stronie wita Cię porównanie ram:

Jak widać, Vibora twierdzi, że jest kilka razy szybsza od klasycznych frameworków i ponad dwa razy szybsza niż jego najbliższy konkurent, Sanic. Oczywiście benchmarki należy brać z przymrużeniem oka.

Chociaż pod względem składni i funkcji, Vibora jest porównywalna z Sanic (a może nawet nieco lepsza, ponieważ zawiera popularne biblioteki i takie rzeczy, jak szablony są dostępne po wyjęciu z pudełka), uważam, że Sanic jest bardziej dojrzały, ponieważ istnieje dłużej i ma większa społeczność.

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)

Jeśli jednak jesteś uzależniony od wydajności, Vibora może unosić twoją łódź. To powiedziawszy, od momentu pisania Vibora jest w trakcie całkowitego przepisywania, aby stać się jeszcze szybszym, a połączyć do wersji wydajnościowej mówi, że jest w trakcie „ciężkiego rozwoju”. Będzie to rozczarowanie dla tych, którzy wcześniej wybrali Viborę i wkrótce będą musieli zmierzyć się z przełomowymi zmianami, ale hej, to dopiero początek asynchronicznego świata Pythona i nikt nie oczekuje, że wszystko będzie stabilne.

Kwarta

Jeśli lubisz programować w Flask, ale żałujesz braku obsługi asynchronicznej, spodoba ci się Kwarta dużo.

Quart jest zgodny z ASGI standard, który jest następcą słynnego standardu WSGI i oferuje obsługę asynchroniczną. Interesującą rzeczą w Quart jest to, że jest nie tylko podobny do Flask, ale jest w rzeczywistości zgodny z Flask API! Autor tego frameworka chciał zachować atmosferę Flask i po prostu dodać do niej obsługę async, WebSockets i HTTP 2. W rezultacie możesz nauczyć się Quart bezpośrednio z dokumentacji Flask, pamiętając tylko, że funkcje Quart są asynchroniczne.

from quart import Quart

app = Quart(__name__)

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

app.run()

Czuje się (prawie) dokładnie jak Flask, prawda?!

Ponieważ Quart jest ewolucją Flask, dostępne są wszystkie funkcje Flask: routing, oprogramowanie pośredniczące, sesje, szablony, plany i tak dalej. W rzeczywistości możesz nawet używać rozszerzeń Flask bezpośrednio w Quart. Jednym haczykiem jest to, że obsługiwany jest tylko Python 3.7+, ale jeśli nie używasz najnowszej wersji Pythona, być może async nie jest właściwą ścieżką.

Dokumentacja jest bardzo potrzebna, jeśli nie masz wcześniejszego doświadczenia z Flask, ale mogę polecić Quart, ponieważ jest to prawdopodobnie jedyny framework asynchroniczny, który wkrótce zostanie wydany w wersji 1.0.

FastAPI

Ostatnim (ale najbardziej imponującym) frameworkiem na tej liście jest: FastAPI. Nie, nie jest to framework tylko do API; w rzeczywistości FastAPI wydaje się być najbardziej funkcjonalnym i bogatym w dokumentację frameworkiem, na który natknąłem się badając asynchroniczne frameworki Python.

Warto zauważyć, że autor frameworka przestudiował dogłębnie kilka innych frameworków, od współczesnych, takich jak Django, po nowoczesne, takie jak Sanic, a także przyjrzał się innym technologiom w NestJS (framework sieciowy Node.js, Typescript). Ich filozofię rozwoju i rozbudowane porównania można przeczytać tutaj.

Składnia jest całkiem przyjemna; można nawet twierdzić, że jest to o wiele przyjemniejsze niż inne frameworki, z którymi się spotkaliśmy:

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 teraz lista zabójczych funkcji, które sprawiają, że FastAPI przyćmiewa inne frameworki:

Automatyczne generowanie dokumentów API: Gdy tylko Twoje punkty końcowe zostaną napisane, możesz grać z API przy użyciu zgodnego ze standardami interfejsu użytkownika. Obsługiwane są SwaggerUI, ReDoc i inne.

Framework wykonuje również automatyczną dokumentację modelu danych za pomocą schematu JSON.

Współczesny rozwój: Tak, słowo „nowoczesny” jest często rzucane, ale znalazłem FastAPI, aby właściwie go przemówić. Wstrzykiwanie zależności i podpowiedzi typu to pierwszorzędni obywatele, wymuszający nie tylko dobre zasady kodowania, ale także zapobiegający błędom i zamieszaniu na dłuższą metę.

Obszerna dokumentacja: nie wiem jak wy, ale jestem totalnym frajerem dobrej dokumentacji. I w tym obszarze FastAPI wygrywa bez trudu. Ma strony na stronach dokumentów wyjaśniających prawie każdą najmniejszą subtelność i „uważaj!” chwile dla programistów na wszystkich poziomach. Wyczuwam tutaj wyraźne „serce i duszę” w dokumentacji, a jedyne porównanie, jakie mogę znaleźć, to dokumentacja Django (tak, dokumentacja FastAPI jest tak dobra!).

Poza podstawami: FastAPI obsługuje WebSockets, Streaming, a także GraphQL, oprócz posiadania wszystkich tradycyjnych pomocników, takich jak CORS, sesje, pliki cookie i tak dalej.

A co z występem? Cóż, FastAPI jest zbudowany na niesamowitej bibliotece Starlette, co zapewnia wydajność dorównującą Node, a w niektórych przypadkach nawet Go! Podsumowując, naprawdę mam wrażenie, że FastAPI będzie ścigać się jako najlepszy framework asynchroniczny dla Pythona.

Wniosek

Wiele się obecnie dzieje w krajobrazie asynchronicznym Pythona. Pojawiają się nowe frameworki, stare są przepisywane, a biblioteki ewoluują, aby pasowały do ​​zachowania asynchronicznego. Chociaż Python ma wbudowaną obsługę pętli zdarzeń i możliwe jest asynchroniczne tworzenie części aplikacji, możesz wybrać opcję „wszystko” i zbudować na jednej z platform tutaj. Pamiętaj tylko, aby mieć na uwadze długoterminową perspektywę: kilka frameworków asynchronicznych Pythona jest na wczesnych etapach i jest szybko rozwijanych, co zaszkodzi Twojemu procesowi rozwoju i podniesie koszty biznesowe. Ostrożność jest kluczem!

Ale wszystko zostało powiedziane i zrobione; Python jest gotowy do produkcji, aby zapewnić wydajność, jeśli chodzi o frameworki internetowe. Jeśli przez tak długi czas myślałeś o migracji do Node, teraz nie musisz!

Brzmi nieźle? Opanuj Pythona już dziś!