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