Laboratorium Kierunki Rozwoju oprogramowania REST, Django
Transkrypt
Laboratorium Kierunki Rozwoju oprogramowania REST, Django
Laboratorium Kierunki Rozwoju oprogramowania REST, Django 1. Instalacja oprogramowania: sudo apt-add-repository universe && sudo apt-get upgrade sudo apt-get install python-pip -y sudo pip2 install django==1.9.2 django-debug-toolbar sudo pip2 install django-extensions werkzeug sudo pip2 install django-werkzeug-debugger-runserver 2. W systemie powinno być dostępne polecenie d jango-admin. Wykonaj je i zobacz jakie opcje są dostępne. Następnie stwórz nowy projekt i dodaj do niego nową aplikację: django-admin startproject <project> && cd <project> django-admin startapp <app> 3. Aby uruchomić aplikację wykonaj polecenie: ./manage.py runserver Przeanalizuj otrzymane komunikaty i zastosuj się do nich. 4. Otwórz adres http://localhost:8000 . Sprawdź co dzieje się po stronie serwera 5. Gratulację! Właśnie stworzyłeś swój pierwszy działający projekt. Zajmij się edycją ustawień projektu. Plik znajduje się w folderze <project>/<project>. Dodaj nazwę swojej aplikacji do tablicy INSTALLED_APPS. Ponadto dodaj aplikację d ebug_toolbar oraz werkzeug_debugger_runserver (ostatni wpis musi znajdować się przed django.contrib.staticfiles). UWAGA nazwy wpisywane to tablicy INSTALLED_APPS mają być wpisywane bez przedrostków takich jak django.contrib . Zmień nazwę tablicy MIDDLEWARE na MIDDLEWARE_CLASSES. Uruchom serwer ponownie i napraw ewentualne problemy. Na końcu dodaj wpis do tabeli INTERNAL_IPS z adresami, którym będzie wyświetlał się panel do debugowania (127.0.0.1). 6. Na końcu pliku urls.py dodaj poniższy kod: from django.conf import settings from django.conf.urls import include, url if settings.DEBUG: import debug_toolbar urlpatterns += [ url(r'^__debug__/', include(debug_toolbar.urls)), ] 7. Przejdź pod adres http://localhost:8000/<app>. W związku z tym, że nie dodaliśmy jeszcze nic ciekawego, jedyne do czego mamy dostęp to panel administratora. Najpierw jednak należy wygenerować konto administratora: ./manage.py createsuperuser Jeżeli pojawi się komunikat o braku tabeli w bazie danych wykonaj polecenia ./manage.py makemigrations ./manage.py migrate Dostęp do panelu administratora: http://localhost:8000/admin 8. Nie ma tam nic poza informacjami o grupach i użytkownikach. Możesz zobaczyć jak wygląda zarządzanie nimi oraz uprawnieniami. 9. Stwórzmy dwa modele reprezentujące wpisy na blogu, oraz kategorie do jakich je przyporządkujemy. Otwórz plik models.py w folderze z aplikacją i dodaj dwie klasy o nazwach Blog i Category: class Blog(models.Model): title = models.CharField(max_length=100, unique=True) … def __unicode__(self): return '%s' % self.title Funkcja __unicode__ będzie odpowiadała za zwracanie reprezentacji obiektu jeżeli nie odwołamy się bezpośrednio do któregoś z pól (przydatne w listach i czasami w widokach) Aby dodać więcej pól do tabeli, zdefiniuj nowe pola w klasie model. Dostępne pola mogą mieć klasy takie jak T extField, ForeignKey, DateField. Dokumentacja tych typów jest dostępna na stronie https://docs.djangoproject.com/en/1.10/ref/models/fields/ Model Blog powinien zawierać 4 pola (tytuł, tekst, relacje do tablicy categories, oraz datę publikacji). Model Category powinien zawierać co najmniej jedno pole (tytuł). 10.Modele nie będą jednak działały dopóki nie wygenerujemy odpowiadającym im tabel w bazie danych ./manage.py makemigrations ./manage.py migrate UWAGA przy każdej zmianie table konieczne jest powtórzenie tych poleceń 11. Teraz aby modele były dostępne w panelu administratora trzeba je zarejestrować w pliku a dmin.py: from <app>.models import B log, Category admin.site.register(Blog) Widok modelu może być customizowany dzięki zarejestrowaniu ich z dodatkowym argumentem: class BlogAdmin(admin.ModelAdmin): search_fields = ['title'] list_display = ['title', 'posted'] list_filter = ['posted'] admin.site.register(Blog, BlogAdmin) UWAGA Raz zarejestrowany model nie może być zarejestrowany jeszcze raz. Jeżeli chcesz użyć powyższej metody, usuń wpis z poprzedniego akapitu. Pamiętaj także, że powyższa funkcja pozwala na użycie pewnych pól z modeli, a Twoje pola mogą mieć inne nazwy. 12. Dodaj kilka wpisów i kategorii używając panelu administracyjnego. 13. Teraz zajmiemy się logiką aplikacji pobierającą dane z modelu i przekazującą je do Templatów. W pliku v iews.py dodaj metodę: from django.shortcuts import render_to_response from django.shortcuts import get_object_or_404 def index(request): return render_to_response('index.html', { 'categories': Category.objects.all(), 'posts': Blog.objects.all()[:8]}) 14. Aplikacja musi wiedzieć do jakiej metody przekierować rządanie przychodzące. W tym celu musimy dodać w pliku urls.py w tablicy urlpatterns dodatkowy wpis: url(r'^blogapp/', 'b logapp.views.index', name=’mainview’), UWAGA: Dodaj ten wpis w tablicy a nie w instrukcji warunkowej poniżej tablicy 15. Teraz możemy wyświetlić stronę główną naszej aplikacji, ale okazuję się, że brakuje nam pliku template do wyświetlenia. Umieść plik index.html w folderze templates w katalogu głównym aplikacji. {% for post in posts %} {{ post }} <br/> {% endfor %} Sprawdź działanie strony głównej. UWAGA: Jeżeli zmieniłeś położenie katalogu templates, musisz ręcznie zrestartować serwer 16. Dodaj w pliku v iews.py kolejne akcje odpowiadające za wyświetlanie wpisu i kategorii o zadanym id (powinna ona wyświetlać listę postów do niej przypisanych). Listy powinny być “klikalne” - przenosić na strony prezentujące pojedynczy wpis, albo wpisy z wybranej kategorii. Dodaj do strony dowolny arkusz ze stylami, tak aby była ona bardziej reprezentatywna. ● Aby odfiltrować wpisy po danym kryterium: Blog.objects.filter(category=categoryobj) Gdzie categoryobj jest wcześniej pobranym obiektem zawierającym kategorię. ● Jeżeli chcesz aby w przypadku braku obiektu o zadanym id zamiast błędów pojawiła się strona ze statusem 404: categoryobj = g et_object_or_404(Blog, id=categoryId), ● Jeżeli funkcja ma pobierać dodatkowy parametr przekazywany w URL, należy dodać dodatkowy argument do jej definicji, a ponadto zmienić wpis w pliku u rls.py (wyrażenia regularne): url(r'^blogapp/view/([0-9]+)', 'blogapp.views.view_post', name=’blogview’), Każdy argument zawarty w nawiasach okrągłych zostanie przekazany do funkcji w pliku v iews.py do odpowiedniej funkcji ● Aby lista kategorii lub wpisów była klikalna w momencie tworzenia pliku z widokiem można posłużyć się funkcją url: {% <nazwa_funkcji_z_pliku_views.py> arg1 arg2 … %} ● Zauważ że pliki zawierające templaty mają wiele elementów powtarzających się. Możemy stworzyć plik bazowy (zawierający sekcję head, title, nagłówki i stopkę) i zaznaczyć w nim miejsca gdzie będą wstawiane elementy innych templatów. Stwórz plik base.html który zawierać będzie strukturę pliku html. (<html><head>... </html>). Następnie miejsca uzupełniane przez templaty go rozszerzające zadeklaruj w poniższy sposób: {% block <nazwa bloku>%} {% endblock %} Teraz możesz stworzyć templaty rozszerzające ten bazowy. Wystarczy że zaczniesz je od linii: {% extends 'base.html' %} A miejsca do uzupełnienia oznaczysz: {% block <nazwa bloku>%} Zawartość do wyświetlenia {% endblock %} Pamiętaj aby pomiędzy nimi znalazła się jakaś zawartość. 17. Po zakończeniu zadań spakuj cały projekt do pliku zip i prześlij go prowadzącemu