Django oczami programisty PHP Mateusz Kupczyk1 1 Wydział Inżynierii Mechanicznej i Informatyki Kierunek informatyka, Rok II [email protected] Streszczenie Praca przybliża cechy aplikacji o nazwie „Django”, która jest używana przy tworzeniu aplikacji internetowych. Dzięki zapewnieniu podstawowych funkcjonalności wykorzystywanych w większości tego typu aplikacji, Django skraca czas realizacji projektu, natomiast specyfika języka Python zwiększa czytelność i wydajność kodu w stosunku do popularnych języków (m.in. PHP). 1 Dlaczego nie PHP? PHP [1] to obecnie najpopularniejszy język tworzenia aplikacji internetowych, który jest używany w ponad 75% stron internetowych [2]. Jest to język interpretowany, jednak za pomocą odpowiednich rozszerzeń możliwe jest zachowanie w pamięci skompilowanej wersji kodu źródłowego. Ze względu na swoje rozpowszechnienie cieszy się on ogromnym wsparciem, jest ciągle rozwijany, a liczba bibliotek stale wzrasta. Na popularności ciągle zyskują frameworki webowe (biblioteki implementujące szereg funkcjonalności stanowiących podstawę działania aplikacji, takich jak obsługa połączenia z bazą danych, sesji, mapowanie adresów URL, itp.), a także gotowe systemy CMS (Wordpress, Joomla, Drupal, Symphony). Dlaczego więc z tego rezygnować? Przyglądając się zmianom, jakie zaszły w PHP od wersji 3, nie da się zaprzeczyć, że jest ich sporo. Ciężko ukryć fakt, że zmiany te wynikały z „potrzeby”, a nawet idąc trochę dalej – powinny być wprowadzone jeśli nie od początku, to przynajmniej w momencie, gdy język ten zyskał na popularności. Obserwując na bieżąco aktualizacje trudno nie odnieść wrażenia, że pewne funkcjonalności były wprowadzane na siłę. Dlatego też dopiero PHP w wersji 5 obsługuje obiektowość, choć trochę podobną do tego, jak powinna ona wyglądać, w wersji 5.3 dodano przestrzenie nazw (których standardowa biblioteka PHP nie używa i przechowuje wszystkie funkcje w zasięgu globalnym), etc. Ze względu na wsteczną kompatybilność, wraz z wprowadzeniem (standardowych dla innych języków wysokiego poziomu) rozwiązań, programista może tworzyć tworzyć oprogramowanie w języku PHP nie wykorzystując nowych rozwiązań. 1 Niestety, przez to jakość kodu „produkowanego” przez wielu programistów jest co najmniej wątpliwa. Problem pojawia się wtedy, kiedy klient chce zmodyfikować swoją stronę internetową lub wykorzystać jej kod w innej aplikacji. Z punktu widzenia doświadczonego programisty, zazwyczaj lepszym rozwiązaniem jest przepisanie takiego kodu od nowa (za który przecież już ktoś zapłacił), bo jego utrzymanie w takiej postaci byłoby za drogie, o ile ktoś w ogóle by się tego podjął. 2 Czym jest Django? Cytując opis ze strony głównej projektu: „Django to webowy framework wysokiego poziomu napisany w Pythonie z myślą o szybkim rozwoju aplikacji, posiadający przejrzystą i pragmatyczną architekturę” [3]. Projekt został rozpoczęty w 2004 przez kilku programistów zatrudnionych w gazecie redagowanej w Kansas, Lawrence Journal-World. Jak sami wspominają, z uwagi na dziennikarski charakter branży, terminy, których musieli przestrzegać, zazwyczaj sięgały kilku godzin, a większość zadań musiała być zrobiona „na wczoraj”. Dlatego też postanowili oni stworzyć narzędzie, dzięki któremu będą mogli pracować szybciej i wygodniej. Tak zrodził się pomysł napisania szkieletu aplikacji, który zapewniałby podstawową funkcjonalność w każdym projekcie. Główną zasadą Django jest oparcie działania na mniejszych modułach (nazywanych aplikacjami, ang. apps) oraz tworzenie ich w taki sposób, aby mogły być one użyte w kolejnych projektach. Tak jak pozostałe frameworki, Django zapewnia obsługę połączenia z bazą danych (wraz z mechanizmem ORM), umożliwia definiowanie własnych adresów URL, a wszystko w oparciu o subtelną odmianę wzorca MVC (ang. model-view-controller). Funkcjonalnością, która wyróżnia Django na tle różnych aplikacji tego typu, jest automatyczne generowanie panelu administracyjnego strony. Mając zaprojektowane modele strony, za pomocą kilku linii kodu można wygenerować kompletny system zarządzania treścią (umożliwiający dodawanie, usuwanie i edycję poszczególnych obiektów), razem z panelem logowania oraz systemem użytkowników i uprawnień. Co więcej, system poprawnie obsługuje różne typy relacji między obiektami, pozwala na wyszukiwanie, filtrowanie i pełne dopasowanie panelu do potrzeb użytkownika. Wszystkie te funkcjonalności pozwalają znacznie skrócić czas pracy nad projektem oraz umożliwiają programiście skupienie się na wyglądzie i działaniu produktu zamiast na kwestiach implementacyjnych. Django, jako framework, nie jest rewolucyjny (istnieją szkielety przeznaczone do używania wraz z językiem PHP), jednak pewne jego cechy znacznie zwiększają wygodę tworzenia kodu oraz zmniejszają czas przeznaczony na wykonanie zadania. 3 Podstawowe cechy Django 3.1. Python Django zostało w całości napisane w Pythonie. Pierwszym, znacznym usprawnieniem względem języka PHP jest fakt, iż Python to język kompilowany do byte-code’u, co przekłada się bezpośrednio na wydajność napisanych aplikacji. Rysunek 1 przedstawia wyniki testu wydajnościowego różnych frameworków 2 webowych pod zasymulowanym obciążeniem kilkudziesięciu użytkowników jednocześnie przeglądających stronę internetową. Jak widać na poniższym wykresie, pod bardzo dużym obciążeniem frameworki używające języka PHP (CodeIgniter oraz Symfony) ustępują wydajnością Django. Rys. 1. Porównanie wydajności kilku frameworków webowych (źródło: [4]). Wykres przedstawia zsumowany czas odpowiedzi aplikacji na wszystkie zapytania. Osoby, które wcześniej miały styczność tylko z językami podobnymi do C/C++ (Java, PHP), na pewno zauważą sporo różnic, przede wszystkim w składni. Python nie używa nawiasów klamrowych, a zamiast nich wykorzystuje wcięcia. W Pythonie wszystko jest traktowane jako obiekt. Przykładowy kod funkcji obliczającej silnię w PHP i Pythonie przedstawia rys. 2. Rys. 2. Porównanie kodu źródłowego PHP i Python. Różnice te, choć na początku mogą być męczące (głównie ze względu na poprzednie przyzwyczajenia), znacząco poprawiają jakość kodu. Składnia w pewien sposób wymusza stosowanie jednolitego stylu programowania, dzięki czemu kod staje się czytelniejszy, przez co łatwiej jest nim zarządzać i wprowadzać w nim zmiany po dłuższym czasie. O tym jak wielką wagę twórcy Pythona przykładają do jakości 3 tworzonego kodu jest fakt sformułowania przez nich filozofii tego języka – tzw. „Zen of Python” (angielska wersja jest dostępna na oficjalnej stronie [5]). Na uwagę zasługuje również obszerna, spójna biblioteka standardowa Pythona. Całość jest pogrupowana w oddzielne moduły, w przeciwieństwie do ogromnej ilości funkcji dostępnych w zasięgu globalnym kodu PHP, których podział w większości ogranicza się do nadania ich nazwom różnych przedrostków. Dokumentacja Pythona jest szczegółowa, choć niekiedy znalezienie informacji, która nas interesuje, mogłoby trwać trochę krócej. Korzystając z wyszukiwarki Google oraz ograniczając wyniki tylko do oficjalnej dokumentacji, w niektórych przypadkach natrafimy na podstronę, która zawiera między innymi informację, której szukamy, jednak odnalezienie jej pośród wielu opisów może zająć nieco więcej czasu. 3.2. Model-View-Template (MVT) Django wykorzystuje wzorzec projektowy MVT (model-widok-szablon). Zakłada on podział aplikacji na 3 podstawowe części: • Model – reprezentuje logikę aplikacji. • Szablon (template) – określa, w jakiś sposób dane mają zostać wyświetlone. • Widok (view) – odpowiada za wybór danych do wyświetlenia (na podstawie przesłanego zapytania, informacji nt. obecnie zalogowanego użytkownika, itp.) Wzorzec MVT (lub bardzo podobny, MVC – ang. model-view-controller) jest w chwili obecnej najczęściej stosowanym wzorcem w trakcie tworzenia aplikacji internetowych. Pozwala on skutecznie rozdzielić poszczególne warstwy, dzięki czemu wymiana jednego modułu nie wpływa w żaden sposób na działanie całej aplikacji. Doskonale można to zobrazować na przykładzie aplikacji, której zadaniem byłoby załadowanie danych z bazy MySQL oraz wyświetlenie ich na stronie internetowej. Widok odpowiadałby za utworzenie obiektu modelu oraz pobranie danych – to, w jaki sposób będą one załadowane/przetworzone/itp. zależy tylko od modelu. Następnie, zadaniem widoku byłoby załadowanie szablonu oraz przekazanie mu odpowiednich danych – analogicznie do sytuacji z modelem, widok nie wie jaką czcionkę będzie napisany tekst lub czy dane będą wypisane jako lista czy tabelka (zależy to tylko i wyłącznie od pliku, w którym znajduje się szablon). Dzięki takiemu podejściu zmiana szaty graficznej podstrony ogranicza się tylko do zmiany uniwersalnego pliku szablonu, a dopisanie kolejnej opcji przechowywania danych (np. w plikach tekstowych) sprowadza się do utworzenia kolejnej klasy modelu. 3.3. Baza danych Django wspiera różne typy systemów baz danych, a ich wykorzystanie sprowadza się do wyboru i odpowiedniego skonfigurowania danego silnika. Standardowo możliwa jest obsługa baz MySQL, PostgreSQL, SQLite oraz Oracle. Dodatkowo framework pozwala na automatyczne generowanie oraz aktualizację struktury poszczególnych tabel na podstawie odpowiadających im modeli (rys. 3. i 4.). Dzięki temu programista może skupić się na zaprojektowaniu klasy modelu, a utworzeniem tabeli, założeniem indeksów na pola oraz zapewnieniem obsługi relacji między tabelami zajmie się Django. 4 Rys. 3. Przykładowy kod klasy modelu „Entry”. Rys. 4. Tabela w bazie danych automatycznie wygenerowana na podstawie modelu „Entry”. W skład Django wchodzi również zaawansowany system ORM (ang. object relational mapping), który pozwala na reprezentację danych pobranych z bazy jako obiektów. Zwrócone przez bazę rekordy są obiektami z zaimplementowanymi metodami umożliwiającymi zapisanie nowego rekordu, modyfikację czy usunięcie. Co więcej, framework zapewnia wsparcie dla obsługi relacji między różnymi tabelami, dzięki czemu możliwa jest optymalizacja zapytań i zarządzanie „powiązanymi” rekordami w innych tabelach. 3.4. Panel administracyjny Sztandarową funkcjonalnością Django, która zdecydowanie odróżnia go od reszty webowych frameworków, jest aplikacja „Django admin”, która zapewnia automatyczne generowanie panelu administracyjnego na podstawie utworzonych modeli. Podstawowe możliwości: • System użytkowników zarządzających treścią wraz z możliwością ograniczenia uprawnień. • Zarządzanie danymi wewnątrz modelu – dodawanie nowych rekordów, edycja oraz usuwanie istniejących. • Automatyczne tworzenie formularzy na podstawie pól modelu wraz z walidacją zapisywanych danych. • Wyświetlanie listy rekordów, możliwość ich sortowania, wyszukiwania oraz filtrowania według określonych kryteriów. • Definiowanie własnych podstron w panelu. Rysunki 5 oraz 6 przedstawiają wygląd panelu administratora, który został wygenerowany za pomocą mniej niż 40 linijek kodu w języku Python. 5 Rys. 5. Lista rekordów danej tabeli. Rys. 6. Automatycznie wygenerowany formularz dodawania rekordu. 3.5. Inne cechy Ze względu na ograniczoną ilość miejsca nie sposób wypisać wszystkich możliwości, które oferuje framework. Zapewnia on jednak wsparcie praktycznie dla wszystkich funkcjonalności odgrywających największe znaczenie z punktu widzenia programisty aplikacji internetowych, m.in.: • Cache [6] – jest to moduł odpowiedzialny za przechowywanie danych pobranych z bazy lub wymagających skomplikowanych obliczeń i umieszczanie ich w pamięci podręcznej (np. w plikach tekstowych). Dzięki temu nie jest konieczne ciągłe „odpytywanie” bazy danych, co w przypadku bardziej rozbudowanych aplikacji znacznie zmniejsza czas działania aplikacji. • Formularze [7] – zapewnia obsługę formularzy, od ich wyświetlania w formie HTML, aż po walidację danych wprowadzonych przez użytkownika. • Własne adresy URL [8] – pozwala powiązać wyrażenia regularne występujące w adresie strony z określonym widokiem, który ma zostać wyświetlony. • Internacjonalizacja oraz lokalizacja [9] – zestaw narzędzi umożliwiający przetłumaczenie komunikatów i tekstów na stronie oraz udostępnienie jej w różnych wersjach językowych. 4 Podsumowanie Framework Django, który został przedstawiony w tym artykule, niesie ze sobą szereg usprawnień znacznie przyspieszających proces tworzenia aplikacji internetowych. Jego zaletami są przede wszystkim: przejrzystość, świetna 6 dokumentacja, szybkość działania oraz ogromna funkcjonalność, przez co stale zyskuje on na popularności. Ciągle powstają nowe projekty napisane z wykorzystaniem Django, które udowadniają, że dobrze spisuje się on również pod bardzo dużym obciążeniem – przykładami mogą być takie serwisy jak Instagram [10] czy strona internetowa Mozilli [11]. Django jest narzędziem, którego zadaniem jest przeniesienie uwagi programisty na to, jak ma działać końcowa aplikacja, poprzez zmniejszenie ilości czasu spędzonej na implementacji rozwiązań. Nie da się zaprzeczyć, że framework wywiązuje się z niego znakomicie i świetnie spełnia swoją rolę. Bibliografia [1] http://www.php.net [2] http://w3techs.com/technologies/overview/programming_language/all [3] http://www.djangoproject.com [4] http://www.alrond.com/en/2007/jan/25/performance-test-of-6-leading-frameworks/ [5] http://www.python.org/dev/peps/pep-0020/ [6] https://docs.djangoproject.com/en/1.5/topics/cache/ [7] https://docs.djangoproject.com/en/1.5/topics/forms/ [8] https://docs.djangoproject.com/en/1.5/topics/http/urls/ [9] https://docs.djangoproject.com/en/1.5/topics/i18n/ [10]http://www.instagram.com/ [11]http://www.mozilla.org 7