8 świetnych małych frameworków internetowych w Pythonie

Wygoda i wszechstronność języka Python oznacza, że ​​jest on używany do tworzenia oprogramowania w prawie każdym obszarze życia IT. Jedną z głównych nisz są usługi internetowe, w których szybkość rozwoju Pythona i elastyczne metafory ułatwiają szybkie tworzenie i uruchamianie witryn internetowych.

I tak jak można się domyślić, Python zapewnia wiele możliwości wyboru i swobody w projektach internetowych, zarówno małych, jak i dużych. W końcu nie każdy projekt internetowy musi mieć skalę korporacyjną. Większość z nich powinna być wystarczająco duża, aby wykonać zadanie, a nie większa. W tym artykule omówiono osiem najbardziej znanych frameworków Pythona, które kładą nacisk na prostotę, lekkość dostarczania i ścisły nacisk.

Butelka

Butelkę można by uznać za rodzaj mini-kolby, ponieważ jest jeszcze bardziej zwarta i zwięzła niż ta inna „mikroframa”. Ze względu na minimalny rozmiar, butelka jest idealna do włączenia do innych projektów lub do szybkiego dostarczania małych projektów, takich jak interfejsy API REST. (Kolbę omówiono poniżej.) 

Cała baza kodu butelki mieści się w jednym pliku i nie ma żadnych zewnętrznych zależności. Mimo to Bottle jest wyposażony w wystarczającą funkcjonalność, aby tworzyć popularne rodzaje aplikacji internetowych bez polegania na pomocy z zewnątrz.

System routingu w Bottle, który odwzorowuje adresy URL na funkcje, ma prawie dokładnie taką samą składnię jak Flask. Nie jesteś też ograniczony do zestawu ścieżek na stałe; możesz je tworzyć dynamicznie. Dane żądań i odpowiedzi, pliki cookie, zmienne zapytań, dane formularzy z akcji POST, nagłówki HTTP i przesłane pliki są dostępne i można nimi manipulować za pomocą obiektów w butelce.

Każda możliwość została wdrożona z dużą dbałością o szczegóły. Na przykład w przypadku przesyłania plików nie trzeba zmieniać nazwy pliku, jeśli jego konwencja nazewnictwa koliduje z docelowym systemem plików (np. Ukośniki w nazwie w systemie Windows). Butelka może to zrobić za Ciebie.

Butelka zawiera własny, prosty mechanizm tworzenia szablonów HTML. Ponownie, choć minimalny, silnik szablonów ma wszystkie podstawowe elementy. Zmienne zawarte w szablonie są domyślnie renderowane za pomocą bezpiecznego kodu HTML; musisz wskazać, które zmienne można bezpiecznie odtworzyć dosłownie. Jeśli wolisz zamienić silnik szablonów Bottle na inny, taki jak Jinja2, Bottle pozwala to zrobić bez problemów. Wolę system prostych szablonów dołączony do Butelki; jest szybki, jego składnia jest bezpretensjonalna i pozwala na mieszanie kodu i tekstu szablonu bez zbędnych trudności.

Butelka obsługuje nawet wiele serwerów zaplecza. Jest dostarczany z własnym wbudowanym serwerem miniserver do szybkiego testowania, ale będzie również obsługiwał ogólny WSGI, szeroką gamę serwerów HTTP zgodnych z WSGI i zwykły stary CGI, jeśli zajdzie taka potrzeba.

Butelka nie potrzebuje tyle dokumentacji, co inne frameworki, ale dokumentacja nie jest bynajmniej skąpe. Wszystkie kluczowe elementy mieszczą się na jednej (choć długiej) stronie internetowej. Oprócz tego znajdziesz pełną dokumentację dla każdego interfejsu API, przykłady wdrażania w różnych infrastrukturach, wyjaśnienie wbudowanego języka szablonów i mnóstwo typowych przepisów.

Podobnie jak w przypadku Flaska, możesz rozszerzyć funkcjonalność butelki ręcznie lub za pomocą wtyczek. Wtyczki do butelek nie są tak liczne jak wtyczki Flask, ale są przydatne elementy, takie jak integracja z różnymi warstwami bazy danych i podstawowe uwierzytelnianie użytkownika. W przypadku obsługi asynchronicznej Bottle może używać jednej z istniejących kart serwerowych, która działa asynchronicznie, na przykład aiohttp / uvloop, ale async/awaitnie jest obsługiwana natywnie.

Jedną z konsekwencji minimalizmu Butelka jest to, że niektórych przedmiotów po prostu nie ma. Walidacja formularza, w tym funkcje takie jak ochrona CSRF (przed fałszowaniem żądań między lokacjami) nie jest uwzględniona. Jeśli chcesz zbudować aplikację internetową, która obsługuje wysoki stopień interakcji z użytkownikiem, musisz samodzielnie dodać tę obsługę.

Innym problemem związanym z Butelką jest to, że rozwój został zatrzymany; ostatnie wydanie punktowe, 0.12, pojawiło się w 2013 r. To powiedziawszy, Bottle nadal jest utrzymywany, a jego wersje rozwojowe nadal nadają się do użytku w produkcji. Deweloperzy zamierzają dostarczyć nowe wersje, które zrzekną się wsparcia dla starszych wersji Pythona.

CherryPy

CherryPy istnieje w takiej czy innej formie od prawie 20 lat, ale nie stracił minimalizmu i elegancji, które wyróżniały go od samego początku.

Celem CherryPy, poza tym, że zawiera tylko same fragmenty potrzebne do obsługi stron internetowych, jest odczucie, na ile to możliwe, nie jak „framework sieciowy”, ale jak każdy inny rodzaj aplikacji w Pythonie. Witryny takie jak Hulu i Netflix wykorzystywały CherryPy w produkcji, ponieważ platforma zapewnia wysoce dyskretną podstawę do tworzenia. CherryPy używa połączonych wątków pod maską, aby lepiej obsługiwać wielowątkowe karty serwerowe.

CherryPy pozwala zachować twoją aplikację internetową z dala od podstawowej logiki. Aby odwzorować funkcje aplikacji na adresy URL lub trasy obsługiwane przez CherryPy, tworzysz klasę, w której przestrzenie nazw obiektów są odwzorowywane bezpośrednio na adresy URL, które chcesz obsługiwać. Na przykład katalog główny witryny jest udostępniany przez funkcję o nazwie „index”. Parametry przekazywane do tych funkcji są używane do obsługi zmiennych udostępnianych przez metody GET lub POST.

Bity zawarte w CherryPy mają działać jako bloki konstrukcyjne niskiego poziomu. Identyfikatory sesji i obsługa plików cookie są uwzględnione, ale szablony HTML nie. Podobnie jak Bottle, CherryPy oferuje sposób mapowania tras do katalogów na dysku w celu obsługi plików statycznych.

CherryPy często odwołuje się do istniejącej biblioteki innej firmy, aby obsługiwać funkcję, zamiast dostarczać ją natywnie. Na przykład aplikacje WebSocket nie są obsługiwane bezpośrednio przez CherryPy, ale przez bibliotekę ws4py.

Dokumentacja CherryPy zawiera poręczny przewodnik po różnych aspektach programu. Nie poprowadzi Cię przez kompletną, kompleksową aplikację, w przeciwieństwie do innych samouczków dotyczących frameworka, ale nadal jest przydatna. Dokumenty zawierają przydatne uwagi dotyczące wdrażania na hostach wirtualnych, odwrotnego proxy za pośrednictwem Apache i Nginx oraz wielu innych scenariuszy.

Sokół

Jeśli tworzysz interfejsy API oparte na REST i nic więcej, Falcon został stworzony właśnie dla Ciebie. Szczupły i szybki, prawie bez zależności poza standardową biblioteką, Falcon zapewnia wszystko, czego potrzebujesz do interfejsów API REST i nic więcej. Falcon 2.0, wydany w 2019 roku, nie obsługuje języka Python 2.xi wymaga co najmniej języka Python 3.5.

Duża część tego, dlaczego Falcon zyskał etykietę „lekki i smukły”, ma niewiele wspólnego z liczbą linii kodu we frameworku. Dzieje się tak, ponieważ Falcon nie narzuca prawie żadnej własnej struktury aplikacjom. Wszystko, co musi zrobić aplikacja Falcon, to wskazać, które funkcje są mapowane na które punkty końcowe API. Zwracanie danych JSON z punktu końcowego obejmuje niewiele więcej niż ustawienie trasy i zwrócenie danych za pośrednictwem json.dumpsfunkcji ze standardowej biblioteki Pythona. Wsparcie dla async nie pojawiło się jeszcze w Falcon, ale trwają prace, aby to się stało w Falcon 3.0.

Falcon stosuje również rozsądne, gotowe do użycia domyślne ustawienia, więc konfiguracja wymaga niewielkiego majsterkowania. Na przykład 404 są generowane domyślnie dla każdej trasy, która nie została jawnie zadeklarowana. Jeśli chcesz zwrócić błędy do klienta, możesz zgłosić jeden z wielu wyjątków giełdowych w pakiecie ze strukturą (na przykład HTTPBadRequest) lub użyć falcon.HTTPErrorwyjątku ogólnego . Jeśli potrzebujesz preprocessingu lub postprocessingu dla trasy, Falcon zapewnia również punkty zaczepienia dla nich.

Skupienie się Falcona na interfejsach API oznacza, że ​​niewiele jest tutaj do tworzenia aplikacji internetowych z konwencjonalnymi interfejsami użytkownika HTML. Nie oczekuj na przykład zbyt wiele funkcji przetwarzania formularzy i narzędzi ochrony CSRF. To powiedziawszy, Falcon zapewnia eleganckie opcje rozszerzenia swojej funkcjonalności, dzięki czemu można budować bardziej wyrafinowane przedmioty. Oprócz wyżej wymienionego mechanizmu podpinania, znajdziesz interfejs do tworzenia oprogramowania pośredniego, którego można użyć do pakowania wszystkich interfejsów API Falcona.

Dokumentacja dla Falcona jest węższa w porównaniu z innymi frameworkami, ale tylko dlatego, że jest mniej do omówienia. Podręcznik użytkownika zawiera formalne omówienie wszystkich głównych funkcji krok po kroku, a także sekcję szybkiego startu, która umożliwia wyświetlenie przykładowego kodu z adnotacjami lub bez.

FastAPI

Nazwa FastAPI jest dobrym podsumowaniem tego, co robi. Jest zbudowany do szybkiego tworzenia punktów końcowych API i działa też szybko.

FastAPI wykorzystuje projekt Starlette do szybkiego rdzenia sieciowego, ale nie musisz wiedzieć o wewnętrznych elementach Starlette, aby korzystać z FastAPI. Definiujesz punkty końcowe w taki sam sposób, jak w aplikacji Flask lub Bottle - używaj dekoratorów, aby wskazać, które funkcje obsługują które trasy - a następnie zwracaj słowniki, które są automatycznie tłumaczone na JSON.

Możesz łatwo zmienić sposób zwrotu rzeczy. Na przykład, jeśli chcesz zwrócić HTML / XML z niektórych punktów końcowych, możesz to zrobić, po prostu zwracając Responseobiekt niestandardowy . Jeśli chcesz dodać niestandardowe oprogramowanie pośredniczące, możesz wstawić wszystko, co jest zgodne ze standardem ASGI. 

FastAPI korzysta z podpowiedzi typu Pythona, aby zapewnić ograniczenia dotyczące rodzajów danych akceptowanych przez trasy. Na przykład, jeśli masz trasę tego typu Optional[int], FastAPI odrzuci wszelkie zgłoszenia oprócz liczb całkowitych. Nie musisz dodawać kodu walidacji danych do swoich punktów końcowych; możesz po prostu skorzystać ze wskazówek dotyczących typów i pozwolić FastAPI wykonać całą pracę.

Oczywiście niektóre rzeczy są pomijane. Na przykład nie ma natywnego silnika szablonów HTML, ale nie brakuje rozwiązań innych firm, aby wypełnić tę lukę. To samo z łącznością z bazą danych, ale dokumentacja zawiera szczegółowe informacje o tym, jak nakłonić niektóre ORM (np. Peewee) do pracy z zachowaniami asynchronicznymi FastAPI.

Kolba

Wiele dyskusji na temat frameworków internetowych Python zaczyna się od Flaska i nie bez powodu. Flask to ugruntowana, dobrze poznana platforma, łatwa w użyciu i całkiem stabilna. Niemożliwe jest popełnienie błędu przy użyciu Flaska dla lekkiego projektu internetowego lub podstawowego interfejsu API REST, ale będziesz musiał stawić czoła ciężkiemu podnoszeniu, jeśli spróbujesz zbudować coś większego.

Głównym atutem Flask jest niska bariera wejścia. Podstawową aplikację „hello world” można skonfigurować w mniej niż 10 wierszach języka Python. Flask zawiera szeroko stosowany system szablonów HTML, Jinja2, ułatwiający renderowanie tekstu, ale Jinja2 można zamienić na dowolną liczbę innych silników szablonów (takich jak Mustache) lub możesz utworzyć własny.

W imię prostoty Flask pomija niuanse, takie jak warstwa danych lub ORM, i nie oferuje żadnych przepisów dotyczących walidacji formularza. Jednak Flask można rozszerzyć za pomocą rozszerzeń, których jest dziesiątki, obejmujących wiele typowych przypadków użycia, takich jak buforowanie, obsługa formularzy i walidacja oraz łączność z bazą danych. Ten domyślny projekt pozwala rozpocząć projektowanie aplikacji Flask z absolutnym minimum funkcjonalności, a następnie nakładać tylko te elementy, których potrzebujesz, kiedy ich potrzebujesz.

Dokumentacja Flaska jest genialna i łatwa do odczytania. Dokument szybkiego startu znakomicie ułatwia rozpoczęcie pracy, jednocześnie wyjaśniając znaczenie domyślnych wyborów dla prostej aplikacji Flask, a dokumentacja API jest pełna dobrych przykładów. Doskonały jest również zbiór fragmentów Flash, które są szybkimi przykładami wykonywania określonych zadań, takich jak zwracanie obiektu, jeśli istnieje, lub błędu 404, jeśli nie.

Flask osiągnął swój kamień milowy w wydaniu 1.0 w 2018 roku, przy czym Python 2.6 i Python 3.3 są minimalnymi obsługiwanymi wersjami, a wiele z jego zachowań zostało ostatecznie ustalonych. Flask nie obsługuje jawnie składni asynchronicznej Pythona, ale kompatybilna z API wersja Flaska o nazwie Quart została wydzielona, ​​aby zaspokoić to zapotrzebowanie.

Piramida

Mała i lekka piramida doskonale nadaje się do zadań, takich jak udostępnianie istniejącego kodu Pythona jako interfejsu API REST lub dostarczanie rdzenia dla projektu internetowego, w którym programista wykonuje większość ciężkich prac.

„Piramida pozwoli Ci szybko osiągnąć produktywność i będzie rosnąć wraz z Tobą”, mówi dokumentacja. „Nie będzie Cię powstrzymywać, gdy aplikacja jest mała, i nie będzie Ci przeszkadzać, gdy aplikacja stanie się duża”.

Dobrym sposobem na opisanie minimalizmu Pyramid byłoby „wolne od polityki”, termin użyty w części dokumentacji, która omawia, jak Pyramid kształtuje się na tle innych frameworków internetowych. Zasadniczo „wolne od zasad” oznacza, że ​​to, która baza danych lub jaki język szablonów wybierzesz, nie dotyczy Pyramid.

Do zbudowania podstawowej aplikacji Pyramid potrzeba bardzo niewiele pracy. Podobnie jak w przypadku Bottle i Flask, aplikacja Pyramid może składać się z pojedynczego pliku Pythona, poza plikami samego frameworka. Prosty interfejs API z jedną trasą wymaga nie więcej niż kilkunastu wierszy kodu. Większość z nich to standardowe from … importinstrukcje i konfigurowanie serwera WSGI.

Domyślnie Pyramid zawiera kilka elementów, które są powszechne w aplikacjach internetowych, ale są one dostarczane jako komponenty do zszywania, a nie jako pełne rozwiązania. Na przykład obsługa sesji użytkowników obejmuje nawet ochronę przed CSRF. Jednak obsługa kont użytkowników, takich jak logowanie lub zarządzanie kontami, nie jest częścią umowy. Będziesz musiał sam go rzucić lub dodać za pomocą wtyczki. To samo dotyczy obsługi formularzy i połączeń z bazami danych.

Pyramid umożliwia nawet tworzenie szablonów z poprzednich projektów Pyramid w celu ponownego wykorzystania wcześniejszej pracy. Te szablony, zwane „rusztowaniami”, generują aplikację Pyramid z prostym routingiem i kilkoma początkowymi szablonami HTML / CSS. Dołączone rusztowania obejmują przykładowy projekt początkowy i projekt, który łączy się z bazami danych za pośrednictwem popularnej biblioteki języka Python SQLAlchemy.