Python jest niczym uniwersalne narzędzie, które w rękach wprawnego programisty może stać się zarówno prostą zabawką, jak i potężną maszyną. Ta wszechstronność przekłada się na szerokie spektrum zastosowań, jakie oferuje ten język.
Python zjednuje sobie serca zarówno amatorów, badaczy, jak i twórców rozbudowanych systemów informatycznych.
Jego zaletą jest niewątpliwie prostota nauki, zaawansowane mechanizmy abstrakcji i możliwość tworzenia złożonych struktur programistycznych, nie wspominając o bogatej bibliotece modułów, która umożliwia realizację niemal każdego zadania. Oczywiście istnieją pewne ograniczenia, np. w dziedzinie współbieżności i statycznego typowania, ale można je skutecznie obejść.
W niniejszym opracowaniu przyjrzymy się bliżej najpopularniejszym i najbardziej efektywnym frameworkom Pythona, które są wykorzystywane do budowy różnorodnych aplikacji internetowych, zarówno tych mniejszych, jak i bardziej rozbudowanych.
Django
Django to framework, który na stałe wpisał się w historię Pythona jako solidna podstawa dla projektów webowych. Można śmiało powiedzieć, że dla wielu programistów Pythona Django jest pierwszym wyborem, gdy w grę wchodzi tworzenie aplikacji internetowych. Jest to swego rodzaju odpowiednik Ruby on Rails dla programistów Rubiego.
Nie bez powodu Django jest tak popularne. Jak głosi jego hasło, jest to „framework dla perfekcjonistów z terminami”. Django jest tzw. „frameworkiem z bateriami w zestawie”, oferującym szeroki wachlarz funkcjonalności gotowych do użycia zaraz po instalacji.
Dzięki bogatemu zestawowi funkcji, Django znacząco skraca czas potrzebny na rozwój oprogramowania:
- Intuicyjny i przyjazny ORM, pozwalający na automatyczne tworzenie i stosowanie migracji.
- Automatyczne generowanie panelu administracyjnego na podstawie zdefiniowanych modeli.
- Kompleksowa obsługa plików cookie, sesji, middleware, szablonów.
- Wbudowane mechanizmy bezpieczeństwa, automatycznie chroniące przed XSS i CRSF.
- Zgodność z praktycznie wszystkimi popularnymi bazami danych.
- Rozbudowana obsługa danych geoprzestrzennych (GeoDjango).
I wiele więcej. Krótko mówiąc, Django to kompleksowy, przyjazny framework do tworzenia aplikacji webowych.
Czy Django jest odpowiednie dla Ciebie?
Zdecydowanie tak. Django sprawdza się w różnych scenariuszach, od szybkiego prototypowania po rozbudowane aplikacje korporacyjne. Jedyną rzeczą, która może sprawić pewne trudności, jest narzucona struktura projektu. Ponieważ Django dąży do maksymalnego uproszczenia i przyspieszenia procesu tworzenia oprogramowania, narzuca programistom swoją architekturę opartą na zasadzie „konwencja ponad konfiguracją”. Jeśli na przykład planujesz zastąpić domyślny ORM Django innym rozwiązaniem, np. SQL Alchemy, musisz się przygotować na pewne komplikacje.
Chcesz stać się programistą full-stack z Django i Pythonem? Koniecznie sprawdź ten świetny kurs online.
Flask
Chociaż Django zdominowało świat web developmentu w Pythonie, Flask stanowi dla niego silną konkurencję.
W przeciwieństwie do Django, Flask jest „mikroframeworkiem”, co oznacza, że skupia się na dostarczaniu podstawowej funkcjonalności, pozostawiając resztę decyzji programiście. To podejście „reszta zależy od Ciebie” może być zarówno źródłem frustracji, jak i satysfakcji, w zależności od Twoich preferencji. Dla doświadczonych deweloperów, którzy chcą mieć pełną kontrolę nad strukturą swojej aplikacji, Flask to strzał w dziesiątkę.
Flask oferuje następujące funkcje:
- Routing, tworzenie szablonów, zarządzanie sesjami i inne przydatne mechanizmy.
- Pełne wsparcie dla testów jednostkowych.
- Minimalistyczna i elastyczna architektura.
- Kompleksowa obsługa interfejsów REST.
- Unikalne podejście do architektury małych aplikacji webowych oparte na Blueprints.
- Dowolność wyboru pakietów dla ORM, migracji itp.
- Elastyczna struktura aplikacji pozwalająca na dowolne rozmieszczenie plików projektu.
- Udostępnianie plików statycznych.
- Zgodność z WSGI.
Czy Flask jest dla Ciebie?
Jak wspomniano wcześniej, Flask to minimalny framework, w którym wszystkie elementy składowe są modułowe i wymienne. Jeśli zależy Ci na szybkim stworzeniu prototypu, to spędzisz dużo czasu na podejmowaniu trywialnych decyzji dotyczących wyboru bazy danych, struktury projektu, routingu itp., co może przynieść efekt przeciwny do zamierzonego. Flask najlepiej sprawdza się w przypadku stabilnych, rozbudowanych projektów o średniej i dużej skali, szczególnie przy tworzeniu interfejsów API REST.
Bottle
Jeśli uważasz, że Flask jest zbyt rozbudowany i chcesz jeszcze większej kontroli nad strukturą aplikacji, to koniecznie zapoznaj się z Bottle.
Bottle idzie o krok dalej w minimalizmie, sprowadzając zależności do absolutnego minimum – jedynym wymaganiem jest standardowa biblioteka Pythona. Oznacza to, że nie musisz instalować żadnych dodatkowych pakietów za pomocą pip, chociaż prawdopodobnie będziesz musiał to zrobić w przyszłości. Bottle wyróżnia się następującymi cechami:
- Implementacja w jednym pliku. Cała aplikacja mieści się w jednym pliku „.py”.
- Brak zewnętrznych zależności. Jeśli masz zainstalowaną odpowiednią wersję Pythona, możesz od razu zacząć.
- Własny silnik szablonów, który można zamienić na Jinja2, Mako lub Cheetah.
- Obsługa formularzy, nagłówków, plików cookie i przesyłania plików.
- Wbudowany serwer webowy z możliwością łatwej wymiany.
Czy Bottle jest dla Ciebie?
Jeśli planujesz budowę bardzo małej aplikacji (powiedzmy, poniżej 500 linijek kodu) bez specjalnych wymagań, Bottle może być idealnym wyborem. Takie podejście do tworzenia aplikacji webowych ma sens, ale w praktyce Bottle może okazać się bardziej przeszkodą niż pomocą. W realnych warunkach wymagania projektu często się zmieniają i zanim się zorientujesz, pojawią się nowe potrzeby. W takim przypadku umieszczenie wszystkiego w jednym pliku stanie się poważnym problemem.
Jeśli myślisz, że Bottle i Flask są podobne, to masz rację. Pomysły dotyczące połączenia tych dwóch frameworków pojawiły się już w 2012 roku i nawet twórca Flaska – Armin, zgadzał się z nimi. Jednak Marcel, twórca Bottle, kategorycznie odrzuca ideę połączenia, powołując się na odmienne podejście do architektury oparte na pojedynczym pliku.
Zope
Zope jest trudny do zdefiniowania, ale postaram się to zrobić. Zope jest frameworkiem webowym, który może być używany do tworzenia aplikacji o różnej skali, ale to nie wszystko. Zope to bardziej platforma składająca się z narzędzi (w tym frameworków webowych) zbudowanych w oparciu o filozofię Zope i rozwijanych przez Zope Corporation.
Zope oferuje szereg interesujących funkcji, przydatnych w tworzeniu aplikacji korporacyjnych:
- Architektura rejestrowania i wykrywania komponentów do konfiguracji rozbudowanych aplikacji.
- ZODB – (jedyna) obiektowa baza danych dla Pythona, służąca do natywnego przechowywania obiektów.
- Rozbudowane ramy i standardy dla systemów zarządzania treścią.
- Zestaw frameworków aplikacji webowych.
- Silne standardy tworzenia, wydawania i konserwacji oprogramowania.
Czy Zope jest dla Ciebie?
Jeśli szukasz wysoce ustrukturyzowanego środowiska do tworzenia naprawdę rozbudowanych aplikacji, Zope to dobry wybór. Musisz jednak liczyć się z pewnymi problemami. Pomimo ciągłego rozwoju Zope, jego społeczność jest niewielka. Wielu programistów Pythona w ogóle o nim nie słyszało. Trudno znaleźć obszerną dokumentację i samouczki, więc przygotuj się na długie poszukiwania. Poza tym, wielu programistów Pythona może nie być zainteresowanych nauką Zope i postrzegać to jako „osłabianie” ich umiejętności.
TurboGears
TurboGears to elastyczny framework o modułowej architekturze. Jest to platforma, którą można dostosować do swoich potrzeb, od prostej aplikacji w jednym pliku po rozbudowany system obsługujący wielu użytkowników.
TurboGears oferuje kilka ciekawych funkcji, które nie są dostępne w popularnych frameworkach (np. Django) lub są trudne do zaimplementowania:
- Kompleksowa obsługa wielu baz danych.
- Transakcje w wielu bazach danych.
- Wysoce modułowa architektura – zacznij od prostego projektu w jednym pliku i rozbudowuj go w miarę potrzeb.
- Zaawansowany ORM (SQLAlchemy).
- Architektura oparta na specyfikacji WSGI.
- Wbudowana obsługa fragmentacji bazy danych.
- Interfejs oparty na funkcjach, w przeciwieństwie do głębokich hierarchii zorientowanych obiektowo.
Czy TurboGears jest dla Ciebie?
Jeśli zależy Ci na stabilnym, dojrzałym i solidnym frameworku z dala od medialnego szumu, TurboGears to bardzo dobry wybór. Jest szanowany w społeczności i posiada obszerną dokumentację. TurboGears nie narzuca żadnych rozwiązań, co może wydłużyć początkowy czas konfiguracji, ale jest to idealna platforma do budowy aplikacji korporacyjnych.
Web2py
Web2py powstał jako projekt hobbystyczny w 2007 roku. Jego celem jest uczynienie tworzenia stron internetowych prostym i dostępnym dla każdego.
Web2py przenosi podejście „zero zależności” do ekstremum – nie wymaga żadnej instalacji. Zawiera w pełni funkcjonalny edytor online do programowania, zarządzania bazami danych i wdrażania.
Można go porównać do Android Studio – Web2py to bardziej kompletne środowisko programistyczne niż tylko framework. Oto niektóre z jego zalet:
- Bardzo niski próg wejścia.
- Minimalny rdzeń (tylko 12 obiektów), który można łatwo opanować!
- Szablony w czystym Pythonie.
- Ochrona przed XSS, CSRF i innymi atakami.
- Przyjazny i spójny interfejs API.
Czy Web2py jest dla Ciebie?
Web2py to stabilny i ciekawy framework, ale trudno go polecić w porównaniu z innymi opcjami, takimi jak Django czy Flask. Nie oferuje zbyt wielu ofert pracy, a historia jego testów jednostkowych nie jest imponująca. Jednak możesz docenić jego prosty interfejs API i ogólną łatwość obsługi, szczególnie jeśli tworzysz interfejsy API REST.
CherryPy
CherryPy to kolejny mikroframework, który oferuje podstawową funkcjonalność i nie przeszkadza programiście w pracy.
Chociaż jest podobny do innych mikroframeworków, takich jak Flask, CherryPy ma pewne cechy, które go wyróżniają:
- Wbudowany serwer wielowątkowy.
- Jeden serwer może obsługiwać wiele aplikacji!
- Możliwość udostępniania aplikacji jako aplikacji WSGI lub jako zwykły serwer HTTP.
- Obsługa profilowania i testów jednostkowych.
- Możliwość uruchamiania na PyPy, Jython, a nawet na Androidzie.
CherryPy oferuje wszystko, czego można oczekiwać od frameworka webowego.
Czy CherryPy jest dla Ciebie?
Jeśli budujesz głównie usługi RESTful, CherryPy jest poważnym konkurentem dla Flaska. Jest to framework o wieloletniej historii, który sprawdzi się zarówno w małych, jak i dużych projektach.
Sanic
Pojawienie się Node.js i jego asynchronicznego modelu programowania stało się wyzwaniem dla wielu społeczności programistycznych, w tym Pythona. W odpowiedzi na to powstała fala asynchronicznych frameworków webowych, a Sanic jest jednym z nich.
Sanic jest inspirowany Flaskiem – zapożyczył od niego dekoratory tras, bluepriny i inne podstawowe elementy. Sanic dodaje do tego nieblokujące wejścia/wyjścia, które pozwalają osiągnąć wydajność na poziomie Node.js. Innymi słowy, Sanic to Flask z obsługą async/await!
W porównaniu z CherryPy, Sanic ma zdecydowaną przewagę pod względem wydajności. Sprawdź wyniki testów wykonanych przez DataWeave:
Jak widać, przy większej liczbie równoczesnych połączeń, CherryPy ma problemy z wydajnością i generuje wiele błędów.
Czy Sanic jest dla Ciebie?
Pomimo imponujących wyników wydajności Sanic nie jest idealnym wyborem do każdego projektu. Głównym powodem jest brak asynchronicznych bibliotek. Większość istniejących bibliotek Pythona została napisana z myślą o jednowątkowym CPythonie, bez uwzględnienia potrzeb współbieżności. Jeśli na przykład Twój ulubiony ORM nie obsługuje asynchronicznych operacji, to cała przewaga wynikająca z Sanica przestaje mieć znaczenie.
Z uwagi na powyższe kwestie nie będziemy analizować kolejnych frameworków asynchronicznych.
Masonite
Jakiś czas temu natknąłem się na ten framework i pomyślałem, że idzie w dobrym kierunku. Od tego czasu została wydana wersja 2.0 i wydaje mi się, że nadszedł czas, aby dać Masonite trochę uwagi.
Mówiąc najprościej, Masonite to odpowiednik Laravela (popularnego frameworka PHP) w świecie Pythona. Laravel z kolei został zainspirowany przez Ruby on Rails. Dzięki tym trzem frameworkom programiści spoza Ruby mogą doświadczyć „Rails Way” tworzenia oprogramowania.
Programiści Laravela (i w pewnym stopniu Railsów) poczują się w Masonite jak w domu. Kiedy po raz pierwszy wypróbowałem Masonite, byłem w stanie szybko zbudować API REST bez większego wysiłku, ponieważ moje przyzwyczajenia z Laravela robiły większość pracy za mnie.
Masonite jako framework „z bateriami w zestawie” oferuje następujące elementy:
- ORM w stylu Active Record.
- Migracje baz danych.
- Potężny kontener IoC do wstrzykiwania zależności.
- Własny interfejs CLI do generowania struktury projektu i uruchamiania zadań.
- Obsługa testów jednostkowych.
Największym konkurentem Masonite jest Django. Społeczność Masonite robi wszystko, co w jej mocy, aby przedstawić platformę jako łatwą, przyjemną i kolejną „wielką rzecz”. Czas pokaże, czy Masonite wyprzedzi Django. Zachęcam do zapoznania się z dyskusjami porównującymi te dwa frameworki tutaj oraz tutaj.
Czy Masonite jest dla Ciebie?
Masonite to nadal młody framework w porównaniu z Django, więc nie można go polecić jako alternatywy dla Django. Jeśli jednak interesuje Cię sposób tworzenia oprogramowania znany z Rails (lub Laravela), to docenisz możliwości, jakie oferuje Masonite. Jest idealny do szybkiego budowania prototypów, które wymagają wstępnie skonfigurowanych i łatwych w użyciu elementów.
Podsumowanie
W świecie Pythona nie brakuje frameworków, zarówno tych małych, jak i dużych. W przypadku mniejszych projektów wybór jest duży. Aplikacje korporacyjne stawiają przed frameworkami bardziej zaawansowane wymagania. Jeśli miałbym wybierać frameworki do rozwoju oprogramowania dla dużych przedsiębiorstw, to zdecydowałbym się na Django, Zope i TurboGears. Osobiście najbardziej skłaniam się ku TurboGears.
Każdy doświadczony programista potrafi wykorzystać mikroframework i wdrożyć własną architekturę. To podejście jest często spotykane w praktyce, co tłumaczy sukces Flaska i podobnych frameworków.
Jeśli dopiero zaczynasz swoją przygodę z Pythonem, to ten kurs online może być dla Ciebie przydatny.
Następnie możesz zapoznać się z wyspecjalizowanymi platformami Pythona do tworzenia interfejsów API.