Professional Documents
Culture Documents
Mikoaj Olszewski
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
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
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
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...
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'
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
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