O. Marszałek, WebSerwisy w Django
Transkrypt
O. Marszałek, WebSerwisy w Django
WebSerwisy w Django Oskar Marszałek Wydział Inżynierii Mechanicznej i Informatyki Kierunek Informatyka, Rok III [email protected] Streszczenie Celem pracy jest zaprezentowanie technologii Web Service na przykładzie aplikacji stworzonej w webowym framework’u Django opartym o j˛ezyk Python. Niniejsza praca ma podkreślić uniwersalność architektury REST, przydatność technologii Web Service oraz prostot˛e ich tworzenia w Django. 1 1.1 Wst˛ep Definicja Web Service[1] Realizowana programistycznie usługa świadczona poprzez sieć telekomunikacyjna,˛ a w tym sieć komputerowa,˛ w szczególności przez Internet. Usługa internetowa jest w istocie składnikiem oprogramowania, niezależnym od platformy sprz˛etowej oraz implementacji, dostarczajacym ˛ określonej funkcjonalności. Zgodnie z zaleceniami W3C, dane przekazywane sa˛ zazwyczaj za pomoca˛ protokołu HTTP i z wykorzystaniem XML. 1.2 Definicja Representational State Transfer (REST)[2] Wzorzec architektury oprogramowania wywiedziony z doświadczeń przy pisaniu specyfikacji protokołu HTTP. REST jest wzorcem architektury oprogramowania wprowadzajacym ˛ dobre praktyki tworzenia architektury aplikacji rozproszonych. REST wprowadza terminy takie jak jednorodny interfejs, bezstanowa komunikacja, zasób, reprezentacja. Architektur˛e REST można podzielić na 2 zagadnienia (Rys. 1). Rzeczowników, czyli inaczej Rys. 1: Uproszczony schemat architektury REST 1 mówiac ˛ zasobów, do których mamy dost˛ep oraz czasowników, które sa˛ uniwersalne. Mam tu na myśli takie metody jak GET, POST, PUT, DELETE itd. Każdy zasób możemy w końcu pobrać, edytować, dodać go lub usunać. ˛ 1.3 Definicja Django[3] Wysokopoziomowy, opensource’owy framework przeznaczony do tworzenia aplikacji internetowych, napisany w Pythonie. Powstał pod koniec 2003 roku jako ewolucyjne rozwini˛ecie aplikacji internetowych, tworzonych przez grup˛e programistów zwiazanych ˛ z Lawrence Journal-World. W 2005 roku kod Django został wydany na licencji BSD. Nazwa frameworku pochodzi od imienia gitarzysty Django Reinhardta. Django opiera si˛e na wzorcu projektowym podobnym do MVC nazywanym MVT (Model-View-Template). 2 Dlaczego WebSerwisy ? WebSerwisy dostarczaja˛ możliwość współdziałania aplikacji napisanych w różnych j˛ezykach i działajacych ˛ na wszelakich platformach. Używaja˛ otwartych standardów i protokołów bazujacych ˛ na tekście czytelnym dla człowieka. Kanałem transportowym jest protokół HTTP, co rozwiazuje ˛ problem obecności firewalla w sieci. Dzi˛eki WebSerwisom wiele instytucji i firm może współdzielić mi˛edzy soba˛ zasoby. Główna˛ zaleta,˛ dla której warto użyć technologii Web Service jest możliwość podziału projektu na moduły co umożliwia późniejszy rozwój aplikacji[8]. 3 Dlaczego Django i REST ? W dzisiejszych czasach ważna˛ kwestia˛ w tworzeniu oprogramowania jest niewatpliwie ˛ czas. Django pozwala na bardzo szybkie stworzenie projektu, rozwini˛eciu go oraz wdrożenie nowych pracowników w zagadnienia danego tematu w bardzo krótkim czasie. Za architektura˛ REST przemawia wiele pozytywnych cech. WebSerwisy napisane w oparciu o REST dostarczaja˛ dobra˛ infrastruktur˛e cache’owania przez metod˛e GET protokołu HTTP. To zwi˛eksza wydajność jeśli dane zwrócone przez WebSerwis nie sa˛ dynamiczne i cz˛esto zmieniane. Znajduje swoje zastosowanie w urzadzeiach ˛ mobilnych tj. smartphone’y przy sprawnym dostarczaniu zasobów aplikacjom. Przede wszystkim sa˛ łatwo integrowane z istni˛ejacymi ˛ już stronami internetowymi. Nie ma potrzeby zmian w kodzie strony. Dzi˛eki temu developerzy sa˛ bardziej produktywni i nie musza˛ tworzyć wszystkiego od nowa, po prostu dodaja˛ istniejac ˛ a˛ już funkcjonalność[9]. 4 4.1 Wykorzystanie Django do stworzenia przykładowej aplikacji używajacej ˛ technologi˛e Web Service Aplikacja Stworzona przeze mnie aplikacja przyjmuje dane z różnych źródeł. W tym wypadku b˛edzie to spis nauczycieli Politechniki Cz˛estochowskiej, pobrany w postaci pliku html ze 2 strony http://www.wimii.pcz.pl . Składa si˛e z dwóch modułów: źródła, gdzie dopisuje si˛e funkcjonalność w oparciu o kolejne źródła danych oraz wyjścia, który pozwala te dane edytować i je zaprezentować. 4.1.1 Wykorzystane moduły urllib2 Moduł j˛ezyka Python do pobierania zasobów z sieci za pośrednictwem URL’i[7]. BeautifulSoup Biblioteka j˛ezyka Python do wyciagania ˛ danych ze stron HTML i plików XML. Udost˛epnia świetny sposób nawigowania, szukania oraz modyfikowania drzewa parsowania. Oszcz˛edza programiście wiele godzin pracy[6]. TastyPie Aplikacja do wystawiania RESTowego API dla naszych aplikacji Django. Za pomoca˛ TastyPie w łatwy sposób możemy udost˛epnić dane zapisane w wybranym modelu. API może być konfigurowane - np. wzbogacone o autoryzacj˛e, czy filtrowanie danych i dost˛epne metody jakie użytkownicy API moga˛ wykonać[4]. 4.2 Tworzenie modeli Model w Django służy do definiowania struktury i relacji tabel w bazie danych. Każdy model jest klasa˛ Pythona dziedziczac ˛ a˛ django.db.models.Model. Każda właściwość klasy-modelu określa pole w bazie danych. Dane niezwiazane ˛ z polami w bazie danych umieszczane sa˛ w wewn˛etrznej klasie "Meta". W django progmista nie posługuje si˛e zapytaniami znanymi z j˛ezyka SQL. Operacje na bazach danych sa˛ przeprowadzane przez ORM Django. Pracujac ˛ na obiektach, pracuje si˛e tak na prawd˛e na rekordach bazy danych. Modele dla tej aplikacji znajduja˛ si˛e odpowiednio w plikach input/models.py oraz output/models.py. 4.2.1 Model Pliku Model File odpowiada za wpis w bazie danych odnoszacy ˛ si˛e do każdego nowo pobranego pliku do folderu ’latest’ lub też jego zarchiwizowanej wersji przeniesionej automatycznie do katalogu ’archive’. Posiada nazw˛e, dowiazanie ˛ do samego pliku oraz czas jego pobrania. 4.2.2 Model obiektu nauczyciela Model Teacher dotyczy obiektu nauczyciela, który powstanie ze sparsowanej z pliku html listy pracowników. Posiada pola takie jak imi˛e, nazwisko, stopień oraz wydział, na którym pracuje. 3 4.3 Mapowanie URL Wszystkie aplikacje internetowe, m. in. WebSerwisy udost˛epniaja˛ jakieś zasoby. Aby si˛e do nich dostać, trzeba odwołać si˛e do konretnego adresu URL. Django umożliwia bardzo prosta˛ i wygodna˛ konfiguracj˛e dost˛epu do danych. W pliku urls.py projektu znajduje si˛e lista, która mapuje konkretne URL’e do widoków dzi˛eki zastosowaniu wyrażeń regularnych. Na przykład poprzez http://localhost:8000/download-teachers zgłasza si˛e żadanie ˛ uaktywniajac ˛ tym samym widok ’download_teachers’, co umożliwi pobranie pliku HTML z ustalonego wcześniej źródła. Odwołujac ˛ si˛e do url’a http://localhost: 8000/parse-teachers, widok odpowiadajacy ˛ za parsowanie pliku HTML dostanie ża˛ danie, obrobi dane tworzac ˛ poszczególne obiekty i zwróci odpowiedź. Można również przez url przekazać dodatkowe argumenty takie jak identyfikator wpisu czy dat˛e jego dodania. 4.4 Tworzenie widoków Widoki w Django pełnia˛ funkcj˛e kontrolera, to one sprawiaja,˛ że aplikacja działa tak, a nie inaczej. Zapewniaja˛ dana˛ funkcjonalność, pozwalaja˛ na przerabianie danych w zamierzony sposób. Decyduja˛ o tym jak informacj˛e b˛eda˛ reprezentowane. Główne widoki w prezentowanej aplikacji odpowiadaja˛ za pobranie, archiwizacj˛e plików źródłowych oraz parsowanie i tworzenie listy obiektów nauczycieli i sa˛ umieszczone w pliku views.py w katalogu odpowiadajacemu ˛ danemu modułowi. 4.4.1 Pobranie oraz archiwizacja plików Plik HTML zawiera list˛e obecnie pracujacych ˛ nauczycieli Politechniki Cz˛estochowskiej i jest pobierany dzi˛eki adresowi URL podanemu na wejście modułu urllib2. Z czasem plik jest nadpisywany przez nowy, np. okresowo co semestr dzi˛eki modułowi Django Celery, a stara wersja zostaje automatycznie przeniesiona do folderu archive. Adres URL do pliku może być podany np. przez formularz na stronie zarza˛ dzajacej ˛ WebSerwisem. 4.4.2 Stworzenie obiektów Rys. 2: Panel administracyjny Gdy plik jest już pobrany, można go sparsować i wyciagn ˛ ać ˛ poszczególne dane za pomoca˛ modułu BeautifulSoup. Uzyskujac ˛ poszczególne dane z pliku, tworzy si˛e lista obiektów (nauczycieli), które zostana˛ zapisane w bazie danych (Rys. 2). 4 4.5 4.5.1 Wykorzystanie TastyPie w aplikacji Instalacja TastyPie Instalacja jest prosta i przyjemna. Wystarczy użyć PIP’a, narz˛edzia do instalacji paczek Python’a (Listing 1). Listing 1: Instalacja TastyPie p i p i n s t a l l d j a n g o −t a s t y p i e 4.5.2 Konfiguracja API Aby ukończyć WebSerwis i udost˛epnić API dla zbioru nauczycieli, należy najpierw dodać wpis w pliku urls.py (Listing 2). Listing 2: Dodanie url’a dla API from l i s t a . a p i import T e a c h e r R e s o u r c e tea cher _res ourc e = TeacherResource ( ) u r l p a t t e r n s += p a t t e r n s ( ’ ’ , url ( r ’^ api / ’ , include ( teacher_resource . urls )) , ) Nast˛epnie utworzyć w pliku api.py klas˛e dziedziczaca ˛ po klasie ModelResource z odpowiednim QuerySet’em, czyli żadaniem ˛ o konkretny zasób danych (Listing 3). from from from from Listing 3: Implementacja kodu API TastyPie t a s t y p i e . r e s o u r c e s import M o d e l R e s o u r c e t a s t y p i e import r e s o u r c e s t a s t y p i e . c o n s t a n t s import ALL i n p u t . m o d e l s import T e a c h e r c l a s s T e a c h e r R e s o u r c e ( MyModelResource ) : c l a s s Meta : queryset = Teacher . o b j e c t s . a l l ( ) resource_name = ’ t e a c h e r ’ f i e l d s = [ ’ name ’ , ’ s u r n a m e ’ , ’ d e g r e e ’ , ’ f a c u l t y ’ ] excludes = [ ’ id ’ ] i n c l u d e _ r e s o u r c e _ u r i = True l i m i t = 250 filtering = \ { " name " : ALL , " s u r n a m e " : ALL , \ " d e g r e e " : ALL , " f a c u l t y " : ALL} 5 4.5.3 Prezentacja API Rys. 3: Wyświetlone zasoby oraz konfiguracja API Każdy ma różne potrzeby, dlatego TastyPie posiada wiele możliwości, dzi˛eki którym można rozwinać ˛ projekt. Dane można filtrować przez dodanie w URL’u tag’ów zgodnych z filtrowaniem QuerySet’ów w Django (Rys. 4). T˛e oraz inne opcje tj. dost˛epne metody, format danych czy autoryzacj˛e można skonfigurować w klasie TeacherResource. Właśnie tak niewiele trzeba by udost˛epnić RESTowa˛ aplikacj˛e w sieci. Rys. 4: Panel administracyjny 6 5 Podsumowanie W pracy przedstawiono zastosowanie WebSerwisu na przykładzie aplikacji stworzonej w webowym framework’u Django opartym o j˛ezyk programowania Python. Dzi˛eki prostocie j˛ezyka i jego tzw. "batteries included", czyli wbudowanym możliwościom, można w bardzo łatwy i szybki sposób stworzyć WebSerwis, który spełni najsurowsze wymagania. Dzi˛eki API zapewnionemu przez moduł TastyPie otrzymuje si˛e uniwersalna˛ i niezależna˛ od architektury reprezentacj˛e danych, które moga˛ posłużyć do wielu rozmaitych celów, najcz˛eściej jako źródło danych dla innego systemu. Moduł ten pozwala na konfiguracj˛e API wedle uznania i we wzorcowy sposób przedstawia działanie aplikacji stworzonej w oparciu o architektur˛e REST. Majac ˛ dost˛ep do metod protokołu HTTP tj. GET, POST, PUT, PATCH czy DELETE można w pełni ingerować w zasoby poprzez adres URL. Dost˛ep do nich można uzyskać z każdej przegladarki ˛ internetowej badź ˛ sieciowej biblioteki programistycznej, cURL. Format danych jest zależny tylko i wyłacznie ˛ od tagu format w zapytaniu. Mamy do dyspozycji JSON, XML, YAML czy bplist. Django udost˛epnia gotowy panel administracyjny, dzi˛eki któremu również można zarzadzać ˛ zasobami. Pozwala na dołaczanie ˛ do naszej aplikacji bazy danych typu postgresql, mysql, sqlite3 lub oracle. Wystarczy uzupełnić wpis w pliku settings.py. Struktura projektu zapewnia możliwość dalszej rozbudowy. W prosty sposób można uzupełnić system o kolejne moduły czy funkcjonalność dla nowych źródeł danych. Dzi˛eki Django oraz j˛ezykowi Python, na którym framework został oparty, oszcz˛edza to czas oraz pieniadze, ˛ co jest bardzo istotne w programowaniu aplikacji i nieprzerwanym rozwoju technologii informatycznych. 7 Literatura [1] Definicja WebService http://pl.wikipedia.org/wiki/Us\T1\luga_internetowa [2] Definicja REST http://pl.wikipedia.org/wiki/Representational_State_Transfer [3] Definicja Django http://pl.wikipedia.org/wiki/Django_(informatyka) [4] Django TastyPie http://www.python.rk.edu.pl/w/p/django-tastypie-czyliwystawianie-restowego-api-w-aplikacjach-django/ [5] Django https://www.djangoproject.com [6] BeautifulSoup http://www.crummy.com/software/BeautifulSoup/bs4/doc/ [7] urllib2 http://www.rwdev.eu/articles/urllib2 [8] dlaczego WebSerwisy http://searchsoa.techtarget.com/tip/REST-vs-SOAP-How-to-choosethe-best-Web-service [9] dlaczego Django i REST http://neo.dmcs.p.lodz.pl/podyplomowe_smtm/webservices/wyklad3_ webservices.pdf 8