You are on page 1of 12

#7: Django I

Mikoaj Olszewski

Jakie pytania po lekturze?

Poznajcie projekt Django

Jeden z najpopularniejszych pythonowych frameworkw W Polsce najpopularniejszy

Kompleksowy framework
Trwao danych Django ORM Automatyczny CRUD Django Admin Mapowanie URL urlpatterns Szablony Django Template Language Cache'owanie z konfigurowalnymi poziomami Wilojzyczno w stylu i18n Renderowanie i przetwarzanie formularzy Wszystko, co potrzebne do szybkiej budowy solidnej aplikacji

Zalety
Popularno Aktywna spoeczno aktywny rozwj 8 wyda w przecigu ostatniego roku! Bogactwo dobrych przykadw Obfity zbir aplikacji (dodatkw funkcjonalnych) Praca Bardzo dobra dokumentacja Read the Docs

Przykady uycia
Pinterest Instagram Disqus Bitbucket Mozilla support Mozilla addons Washingtonpost The Guardian National Geographic Eventbrite Prezi

Organizacja Django
Projekty cao witryny strony

funkcjonalno Aplikacje pojedynczy blok funkcjonalny modu / komponent blog, forum, system rejestracji, system tagowania Jeden projekt zazwyczaj skada si z kilku aplikacji

Projekt Django
rodowisko
$$ virtualenv djangoenv $$ source djangoenv/bin/activate (djangoenv)$$ pip install django (djangoenv)$$ django-admin.py startproject mysite

Struktura
mysite manage.py mysite __init__.py settings.py urls.py wsgi.py

Zarzdzanie
django-admin.py tworzenie nowego projektu lub aplikacji uruchomienie serwera deweloperskiego wykonywanie zada uruchomienie interpretera pythona uruchomienie sesji powoki z baz danych ... manage.py konkretny projekt wraz z rozszerzeniami

Uruchomienie

Serwer deweloperski
(djangoenv)$$ cd mysite/

(djangoenv)$$ chmod a+x manage.py (djangoenv)$$ ./manage.py syncdb (djangoenv)$$ ./manage.py runserver http://localhost:8000

Serwer laboratoryjny
mysite/settings.py STATIC_URL = '/~<user>/static/' STATIC_ROOT = '/home/<user>/www/static' ~/mysite.ini [uwsgi] socket = /tmp/<user>.wsgi.sock chmod-socket = 666 plugin = python virtualenv = /path/to/djangoenv chdir = /path/to/project/dir module = mysite.wsgi komendy (djangoenv)$$ ./manage.py syncdb (djangoenv)$$ ./manage.py collectstatic uwsgi mysite.ini http://<host>/~<user>/wsgi

Domylna strona

Architektura Django
MVC

M. model warstwa danych i dostpu do nich V. widok jakie dane wywietli i w jaki sposb C. kontroler wybr widoku na podstawie danych uytkownika

MVC MVT
MVC Django (MVT) [M] models.py klasy modeli [M] model walidatory zachowania relacje [V] views.py [V] widok logika biznesowa wybr i modyfikacja modeli [T] szablony warstwa prezentacji [C] kontroler framework, urls.py

Dlaczego model w kodzie?


Niedokadno introspekcji i duy narzut czasowy Prosty jzyk, jedno miejsce lepsza produktywno Moliwo wersjonowania modeli i ledzenia zmian Szerszy zakres typw i metadanych (np. adresy e-mail) Rnice w SQL-u midzy bazami

Problemy
Duplikacja informacji Moliwo desynchronizacji (s pomoce)

Podczenie bazy
Django posiada wasny ORM Konfiguracja bazy w settings.py DATABASES = { 'default': {

'ENGINE': 'django.db.backends.<db_backend>', 'NAME': '<db_name>', 'USER': '<db_user>', 'PASSWORD': '<db_password>', 'HOST': '<not_needed_on_localhost>', 'PORT': '<not_needed_on_localhost>', } } sqlite3 nie jest baz produkcyjn, ale dobr do deweloperki

Synchronizacja bazy
Modele django opisuj struktur danych Django ORM buduje tabele w bazie Django z automatu ma wczone kilka aplikacji ze zdefiniowanymi modelami Synchronizacja struktury danych midzy modelami a baz (djangoenv)$$ ./manage.py syncdb Nowe modele nowe tabele Zmiana w starym modelu konieczno wykasowania istniejcej tabeli ( sqlclear)

Przykad
Django tutorial Aplikacja ankietowa Moliwo utworzenia pytania przez uytkownika Moliwo utworzenia odpowiedzi przez uytkownika Moliwo ogldania pyta i wyboru odpowiedzi przez wizytujcych ... Kod na BB

Aplikacja django
(djangoenv)$$ ./manage.py startapp polls

Struktura
mysite manage.py mysite ... __init__.py polls

models.py tests.py views.py

Wczenie
INSTALLED_APPS = ( ... 'polls' )

Modele
polls/models.py Modele to klasy pythonowe dziedziczce po Model Klasa Model dostarcza standardowego API do interakcji z baz danych skupionego wok obiektu definujcego model Automatyczne zarzdzanie poczeniami do bazy Rozszerzanie funkcjonalnoci poprzez dodawanie nowych metod Metody operuj na pojedynczej instancji, czyli na wierszu Poszczeglne pola odnosz si do kolumn Rne rodzaje pl to rne typy kolumn Django automatycznie dodaje klucz gwny Moliwe relacje midzy obiektami Domylnie wszystkie pola/kolumny s ustawiane jako NOT NULL Komendy: validate, sqlall

Powoka Django
Komenda shell Ta sama cieka systemowa ( sys.path) co dla projektu Automatyczny import settings.py Utrzymuje poczenie z baz danych Interakcja z danymi w bazie

API modelu
(djangoenv)$$ ./manage.py shell >>> from polls.models import Poll >>> Poll.objects.count() 0 >>> p1 = Poll(question=u"Jak si nazywasz?") >>> p1.full_clean()

Traceback (most recent call last): ... ValidationError: {'pub_date': [u'This field cannot be null.']} >>> from django.utils import timezone >>> p1.pub_date = timezone.now() >>> p1.full_clean() >>> p1.save() >>> Poll.objects.count() 1

>>> Poll.objects.filter(id=1) [<Poll: Jak si nazywasz?>] [<Poll: Poll object>] >>> mypoll = Poll.objects.get(pk=1) >>> mypoll.published_today() True >>> mypoll.choice_set.all() [] >>> from polls.models import Choice >>> c1 = Choice(choice="Smok Wawelski", poll=mypoll) >>> c1.save() >>> mypoll.choice_set.all() [<Choice: Smok Wawelski>] >>> mypoll.choice_set.all() [<Choice: Smok Wawelski>, <Choice: Kozioek Matoek>] # [<Choice: Choice object>] >>> mypoll.choice_set.create(choice=u"Kozioek Matoek") # [<Poll: Poll object>] >>> Poll.objects.filter(question__startswith="Jak")

Testowanie modelu
Django dostarcza framework testowy Django wspiera zarwno doctest jak i unittest Testy dla aplikacji w polls/tests.py w tym samym katalogu co models.py Uruchomienie testw: (djangoenv)$$ ./manage.py test polls

Co testowa?
Funkcjonalno dostarczan bezporenio przez framework (np. poczenie z baz) Funkcjonalno dodan samodzielnie Zmiany w domylnej funkcjonalnoci

Widoki
Widoki s wywoywalne, przyjmuj danie, zwracaj odpowied Przewanie s to funkcje

Od wersji 1.3 mog to by rwnie klasy

Widoki generyczne
Oparte na klasach Funkcjonalno najczciej uywanych / spotykanych widokw Prosty i generyczny interfejs Rodzaje wywietlenie listy obiektw danego typu wywietlenie szczegw pojedynczego obiektu danego typu wywietlenie statycznego szablonu HTML wywietlenie i przetworzenie prostego formularza HTML

Widoki w aplikacji
Lista wszystkich pyta, najlepiej uoonych w kolejnoci publikacji Wywietlenie pojedynczego pytania, pokazanie moliwych odpowiedzi oraz umoliwienie gosowania Przetworzenie gosowania Wywietlenie wynikw wszystkich gosowa po oddaniu gosu przez uytkownika Najpierw skonfigurujmy cieki...

Routing w Django urlconf


Lista mapowa regua wyraenia regularnego nazwa lub referencja na element wywoywalny (widok) moe posiada nazw (do odwracania URL-i) Uycie django.conf.urls do tworzenia urlconf urlpatterns w pliku podanym w settings.ROOT_URLCONF

urls.py
from django.conf.urls import patterns, include, url ... urlpatterns = patterns('', # lista mapowa )

Konfiguracja URL-i
cieki w aplikacji w polls/urls.py

def stub(request, *args, **kwargs): return HttpResponse('stub view', mimetype="text/plain") urlpatterns = patterns('', url(r'^$', stub, name="poll_list"), url(r'^(?P<pk>\d+)/$', stub, name="poll_detail"), url(r'^(?P<pk>\d+)/vote/$', stub, name="poll_vote"), url(r'^(?P<pk>\d+)/result/$', stub, name="poll_result"), ) Podczenie cieek aplikacji do projektu w gwnym urls.py : urlpatterns = patterns('', url(r'^polls/', include('polls.urls')), )

Szablony w Django
Podobne do Jinja2, ale bardziej ograniczone Wywietlanie zmiennych z kontekstu: {{ zmienna }} Dostp do skadowych obiektw lub wartoci w sowniku: {{ zmienna.element }} Filtry: {{ zmienna|filtr }} Logika: {% for x in y %}{{ x }}{% endfor %} Szablony mog by rozszerzane (dziedziczone) lub wcielane Bloki su do nadpisywania przez inne szablony Nie mona wykonywa dowolnych instrukcji pythonowych cieki poszukiwa okrelane przez obiekty wywoywalne zdefiniowane w settings.TEMPLATE_LOADERS 'django.template.loaders.filesystem.Loader' 'django.template.loaders.app_directories.Loader'

Widoki i szablony dla aplikacji

Lista pyta
Widok generyczny w polls/urls.py Szablon w polls/templates/polls/list.html

Pojedyncze pytanie
Widok generyczny w polls/urls.py Szablon w polls/templates/polls/detail.html Gosowanie zmienia dane w aplikacji (bazie) metoda POST Podatno na atak typu Cross-Site Request Forgery Django middleware automatycznie przed tym chroni, ale trzeba doda znacznik {% csrf_token %} do

formularza

Cross Site Request Forgery


Problem z przesyaniem danych z nieautoryzowanego rda Czue miejsca: ciasteczka i adres IP Moliwoci wylogowanie uytkownika zmiana ustawie uytkownika (np. Google, Amazon) wpisanie komentarza podszywajc si za kogo innego transfer pienidzy ... Zazwyczaj wykorzystanie JavaScriptu Zapobieganie nagwek REFERER ukryte pole: funkcja skrtu lub jednorazowy cig losowy

Widoki i szablony dla aplikacji

Przetwarzanie gosowania
Dane przesyane metod POST wybr wartoci dla klucza choice Schemat widoku w polls/views.py def vote_view(request, pk): if request.method == "POST": try: # sprawdzenie wyboru # walidacja po stronie serwera jest zawsze konieczna! except NoGoodChoice: # bd odesanie widoku szczegowego url = reverse('poll_detail', args=[pk, ]) else: # zapisanie gosu i odesanie wynikw url = reverse('poll_result', args=[pk]) else: # wysane metod GET ignorujemy url = reverse('poll_detail', args=[pk, ]) # przekierowanie return HttpResponseRedirect(redirect_to=url) Widok w polls/views.py, routing w polls/urls.py

Wyniki gosowania
Widok generyczny w polls/urls.py Szablon w polls/templates/polls/result.html

Podsumowanie
Kompleksowy framework MVC ORM testy powoka aplikacje ... Aktywny rozwj Bardzo dobra dokumentacja Ogromna spoeczno

You might also like