Ten artykuł omawia różne serwery WWW napisane w języku Python, które mogą być użyte do wdrożenia aplikacji.
Rozpoczniemy od wyjaśnienia, jak działają serwery WWW i dlaczego potrzebne są interfejsy bram serwera. Następnie przedstawimy listę serwerów internetowych Pythona, wraz z ich kluczowymi cechami. Większość z nich dostępna jest jako pakiety PyPI, co ułatwia ich instalację i użycie w projektach.
Przejdźmy do szczegółów!
Czym jest serwer WWW?
Podczas tworzenia aplikacji w Pythonie, do testowania używa się serwera programistycznego. Jednak po zakończeniu prac programistycznych, aplikację trzeba przenieść na serwer produkcyjny. Serwer WWW powinien realizować podstawowe funkcje serwera HTTP, a także mieć dodatkowe warstwy funkcjonalności.
Serwer WWW Pythona musi obsługiwać żądania HTTP (takie jak GET, PUT i POST) od klientów, np. przeglądarek, i wysyłać odpowiedzi. Odpowiedź może zawierać kod stanu HTTP informujący o powodzeniu lub niepowodzeniu żądania. Może też składać się ze stron HTML oraz ustrukturyzowanych danych, np. JSON czy XML.
ASGI kontra WSGI: Interfejsy bram serwera
Załóżmy, że aplikacja Pythona została stworzona przy użyciu wybranego frameworka, takiego jak Django czy Flask. Zwykły serwer może nie być w stanie poprawnie przetworzyć żądań skierowanych do takiej aplikacji. W tym miejscu kluczową rolę odgrywają interfejsy bram serwera.
Taki interfejs może być interfejsem bramy serwera WWW (WSGI) lub asynchronicznym interfejsem bramy serwera (ASGI). Serwer WWW odbiera żądanie od klienta i przekazuje je do interfejsu bramy serwera. Interfejs (WSGI/ASGI) komunikuje się z aplikacją Pythona poprzez mechanizm wywołania.
Interfejs bramy serwera WWW (WSGI) obsługuje żądania w sposób sekwencyjny. Jeśli napłynie wiele czasochłonnych żądań HTTP, wpłynie to negatywnie na wydajność.
Asynchroniczny Interfejs Bramy Serwera (ASGI) jest następcą WSGI i obsługuje żądania w sposób asynchroniczny.
Załóżmy, że aktualnie obsługiwane żądanie wymaga odczytu danych z bazy danych (co może zająć sporo czasu). Podczas gdy pierwsze żądanie czeka na odpowiedź, ASGI może obsłużyć kolejne żądanie.
W przypadku WSGI, drugie żądanie musi czekać na przetworzenie pierwszego. Dlatego ASGI pozwala na zwiększenie wydajności i umożliwia wykorzystanie asynchronicznych możliwości Pythona w aplikacji.
Serwery WWW w Pythonie
Poniżej znajduje się lista serwerów internetowych, które można wykorzystać w aplikacjach Pythona. Uwzględniono również frameworki, które posiadają wbudowaną obsługę serwerów gotowych do pracy w środowisku produkcyjnym. Nie jest to wyczerpująca lista, a kolejność serwerów jest przypadkowa.
Uvicorn
Osoby korzystające z frameworka FastAPI z pewnością spotkały się z serwerem Uvicorn. Jest to implementacja serwera ASGI dla Pythona.
Aby zainstalować Uvicorn wraz z niezbędnymi zależnościami, należy użyć polecenia:
$ pip install uvicorn[standard] # zawiera instalację opcjonalnych zależności oraz tych opartych na Cythonie
Najważniejsze cechy Uvicorn:
- Implementacja ASGI
- Możliwość uruchamiania aplikacji z asynchronicznego środowiska Python
- Narzędzie wiersza poleceń z rozbudowanym zestawem opcji
- Obsługa uruchamiania aplikacji za pomocą funkcji fabryk
- Funkcje umożliwiające programowe kontrolowanie instancji serwera
Gunicorn
Gunicorn to serwer WSGI dla aplikacji Python, znany z zaawansowanych możliwości zarządzania procesami.
Uvicorn udostępnia klasę pracowników Gunicorn, umożliwiając jednoczesne korzystanie z wydajności i zaawansowanego zarządzania procesami. Dodatkowe informacje można znaleźć w dokumentacji na temat implementacji Gunicorn.
W przypadku posiadania Pythona 3.5 lub nowszego, instalacja Gunicorn odbywa się za pomocą polecenia:
$ pip install gunicorn
Najważniejsze cechy Gunicorn:
- Prostota i szybkość działania
- Kompatybilność z różnymi frameworkami internetowymi
- Wsparcie dla użycia z serwerem proxy HTTP
- Zaawansowane zarządzanie procesami
CherryPy
CherryPy to framework internetowy Pythona, podobny do Django, Flask i FastAPI, choć mniej popularny. Posiada stabilne wydania i rozwinął się w pełnoprawny framework na przestrzeni ponad dekady. Może się również pochwalić aktywną społecznością programistów.
Warto zapoznać się z filozofią CherryPy, która podkreśla, że jest to prosty, minimalistyczny i zarazem potężny framework.
Choć CherryPy jest frameworkiem, a nie serwerem WWW, znalazł się na tej liście, ponieważ natywnie obsługuje serwer produkcyjny, w przeciwieństwie do większości innych frameworków.
Instalacja CherryPy odbywa się za pomocą polecenia:
$ pip install CherryPy
Najważniejsze cechy CherryPy:
- Wykorzystuje programowanie obiektowe w Pythonie; jest odpowiedni dla początkujących
- Wsparcie dla gotowego do produkcji serwera HTTP, Cheroot
- Łatwiejsza nauka w porównaniu do innych frameworków, np. Django
- Możliwość tworzenia i wdrażania prostych aplikacji internetowych opartych o mikroserwisy
Daphne
Django jest jednym z najpopularniejszych frameworków webowych w Pythonie. Osoby tworzące aplikacje w Django prawdopodobnie korzystały z serwera WWW Daphne. Jest to jedna z pierwszych implementacji serwera ASGI, wykorzystywana jako wzorzec.
Daphne jest dostępny jako pakiet PyPI, który instaluje się za pomocą pip:
$ pip install daphne
Tutaj można znaleźć szczegółowy poradnik, który przeprowadzi przez proces tworzenia pełnej aplikacji gotowej do wdrożenia produkcyjnego w Pythonie.
Najważniejsze cechy Daphne:
- Szerokie zastosowanie w środowiskach produkcyjnych
- Wzorzec dla wszystkich implementacji serwera ASGI
- Obsługa protokołów HTTP, HTTP2 i WebSocket
Trio Pythona
Projekt Trio koncentruje się na dostarczaniu asynchronicznych możliwości wejścia/wyjścia klasy produkcyjnej: wsparcie dla równoległego wejścia/wyjścia i współbieżności. W ramach projektu dostępne są również biblioteki internetowe i HTTP dla Pythona.
Najnowsza wersja Trio (czerwiec 2022) może być zainstalowana z PyPI:
$ pip install trio
Poniżej znajduje się lista przydatnych bibliotek Trio do tworzenia aplikacji internetowych w Pythonie:
- hypercorn: Hypercorn to serwer ASGI z obsługą HTTP
- muffin: Muffin to framework webowy ASGI dla Pythona
- starlette: Starlette to lekki framework ASGI
- trio-websocket: wsparcie dla serwera i klienta WebSocket
- httpx: klient HTTP dla Pythona
Twisted
Twisted to framework dla aplikacji Pythona oparty na zdarzeniach, zawierający moduł twisted.web do programowania internetowego.
Instalacja Twisted i powiązanych modułów odbywa się za pomocą pip:
$ pip install Twisted
Najważniejsze cechy Twisted:
- Funkcje przyjazne programistom, takie jak testy jednostkowe i statyczna analiza kodu
- twisted.web dostarcza serwer WSGI, a także wsparcie dla klientów i serwerów HTTP
AIOHTTP
AIOHTTP to biblioteka Pythona, oferująca funkcje po stronie klienta i serwera za pośrednictwem interfejsów API.
Poniższy film wyjaśnia asynchroniczne możliwości programowania po stronie klienta, pozwalające na znaczne przyspieszenie żądań do interfejsów API.
Najważniejsze cechy AIOHTTP:
- Wsparcie dla funkcjonalności serwera HTTP i klienta
- Obsługa logowania w celu ułatwienia debugowania; dzienniki klienta, serwera, gniazd sieciowych itp.
- Natywna obsługa testowania za pomocą wtyczki pytest: pytest-aiohttp, dostępnej jako pakiet PyPI
Tornado
Tornado to kolejny framework webowy Pythona z obsługą sieci asynchronicznych. W ostatnich latach wydano wiele stabilnych wersji Tornado, ostatnia 6.2 w lipcu 2022 roku. Aktualnie Tornado wspiera Pythona 3.7 i nowsze.
Podobnie jak większość pakietów z tej listy, Tornado instaluje się za pomocą pip:
$ pip install tornado
Najważniejsze cechy Tornado:
- Wsparcie dla serwera HTTP tornado.httpserver i klienta
- Skalowalność i wykorzystanie nieblokującego wejścia/wyjścia sieciowego
- Dobrze sprawdza się w aplikacjach wymagających długotrwałego połączenia
- Narzędzia do logowania, testowania jednostkowego itp.
- Łatwa integracja z usługami uwierzytelniania
Meinheld
Meinheld to serwer WSGI dla Pythona. Wykorzystuje i opiera się na istniejących bibliotekach do obsługi zdarzeń i przetwarzania żądań HTTP.
Instalacja Meinheld odbywa się za pomocą polecenia:
$ pip install meinheld
Cechy Meinhelda:
- Wykorzystuje bibliotekę http-parser do obsługi przychodzących żądań HTTP
- Opiera się na bibliotece picoev do obsługi zdarzeń
Podsumowanie
Mamy nadzieję, że ten przegląd serwerów WWW w Pythonie okazał się pomocny. Zachęcamy do wypróbowania ich w przyszłych projektach. Przedstawiliśmy najważniejsze cechy, jednak aby w pełni zrozumieć zależności i sposób działania, konieczne jest użycie ich w praktyce. 👩🏽💻
Jeśli chcesz poszerzyć swoje umiejętności w Pythonie, warto zapoznać się z biblioteką samouczków dostępnych na newsblog.pl. Życzymy udanego kodowania!
newsblog.pl
Maciej – redaktor, pasjonat technologii i samozwańczy pogromca błędów w systemie Windows. Zna Linuxa lepiej niż własną lodówkę, a kawa to jego główne źródło zasilania. Pisze, testuje, naprawia – i czasem nawet wyłącza i włącza ponownie. W wolnych chwilach udaje, że odpoczywa, ale i tak kończy z laptopem na kolanach.