Upload
mikolaj-olszewski
View
257
Download
0
Embed Size (px)
DESCRIPTION
Wprowadzenie do kompleksowych frameworków webowych na przykładzie Django.
Citation preview
#7: Django IMikoaj Olszewski
Jakie pytania po lekturze?
Poznajcie projekt Django
Jeden z najpopularniejszych pythonowych frameworkwW Polsce najpopularniejszy
Kompleksowy frameworkTrwao danych Django ORMAutomatyczny CRUD Django AdminMapowanie URL urlpatternsSzablony Django Template LanguageCache'owanie z konfigurowalnymi poziomamiWilojzyczno w stylu i18nRenderowanie i przetwarzanie formularzy
Wszystko, co potrzebne do szybkiej budowy solidnej aplikacji
Zalety
PopularnoAktywna spoeczno
aktywny rozwj 8 wyda w przecigu ostatniego roku!Bogactwo dobrych przykadwObfity zbir aplikacji (dodatkw funkcjonalnych)PracaBardzo dobra dokumentacja
Read the Docs
Przykady uycia
PinterestInstagramDisqusBitbucketMozilla supportMozilla addonsWashingtonpostThe GuardianNational GeographicEventbritePrezi
Organizacja DjangoProjekty
cao witrynystrony
funkcjonalnoAplikacje
pojedynczy blok funkcjonalny modu / komponentblog, 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
Zarzdzaniedjango-admin.py
tworzenie nowego projektu lub aplikacjiuruchomienie serwera deweloperskiegowykonywanie zadauruchomienie interpretera pythonauruchomienie 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 = '/~/static/'STATIC_ROOT = '/home//www/static'
~/mysite.ini
[uwsgi]socket = /tmp/.wsgi.sockchmod-socket = 666plugin = pythonvirtualenv = /path/to/djangoenvchdir = /path/to/project/dirmodule = mysite.wsgi
komendy
(djangoenv)$$ ./manage.py syncdb(djangoenv)$$ ./manage.py collectstaticuwsgi mysite.ini
http:///~/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 MVTMVC Django (MVT)
[M] model
[M] models.py
klasy modeliwalidatoryzachowaniarelacje
[V] widok
[V] views.py
logika biznesowawybr i modyfikacja modeli
[T] szablony warstwa prezentacji[C] kontroler framework, urls.py
Dlaczego model w kodzie?Niedokadno introspekcji i duy narzut czasowyProsty jzyk, jedno miejsce lepsza produktywnoMoliwo wersjonowania modeli i ledzenia zmianSzerszy zakres typw i metadanych (np. adresy e-mail)Rnice w SQL-u midzy bazami
Problemy
Duplikacja informacjiMoliwo desynchronizacji (s pomoce)
Podczenie bazyDjango posiada wasny ORMKonfiguracja bazy w settings.py
DATABASES = { 'default': {
'ENGINE': 'django.db.backends.', 'NAME': '', 'USER': '', 'PASSWORD': '', 'HOST': '', 'PORT': '', }}
sqlite3 nie jest baz produkcyjn, ale dobr do deweloperki
Synchronizacja bazyModele django opisuj struktur danychDjango ORM buduje tabele w bazieDjango z automatu ma wczone kilka aplikacji ze zdefiniowanymi modelamiSynchronizacja struktury danych midzy modelami a baz
(djangoenv)$$ ./manage.py syncdb
Nowe modele nowe tabeleZmiana w starym modelu konieczno wykasowania istniejcej tabeli ( sqlclear)
PrzykadDjango tutorial
Aplikacja ankietowaMoliwo utworzenia pytania przez uytkownikaMoliwo utworzenia odpowiedzi przez uytkownikaMoliwo ogldania pyta i wyboru odpowiedzi przez wizytujcych...Kod na BB
Aplikacja django(djangoenv)$$ ./manage.py startapp polls
Struktura
mysite manage.py mysite ... polls __init__.py
models.py tests.py views.py
Wczenie
INSTALLED_APPS = ( ... 'polls')
Modelepolls/models.pyModele to klasy pythonowe dziedziczce po ModelKlasa Model dostarcza standardowego API do interakcji z baz danych skupionego wok obiektudefinujcego modelAutomatyczne zarzdzanie poczeniami do bazyRozszerzanie funkcjonalnoci poprzez dodawanie nowych metodMetody operuj na pojedynczej instancji, czyli na wierszuPoszczeglne pola odnosz si do kolumnRne rodzaje pl to rne typy kolumnDjango automatycznie dodaje klucz gwnyMoliwe relacje midzy obiektamiDomylnie wszystkie pola/kolumny s ustawiane jako NOT NULLKomendy: validate, sqlall
Powoka DjangoKomenda shellTa sama cieka systemowa (sys.path) co dla projektuAutomatyczny import settings.pyUtrzymuje poczenie z baz danychInterakcja 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.objects.filter(question__startswith="Jak")[]>>> 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()[] # []>>> mypoll.choice_set.create(choice=u"Kozioek Matoek")>>> mypoll.choice_set.all()[, ]
Testowanie modeluDjango dostarcza framework testowyDjango wspiera zarwno doctest jak i unittestTesty dla aplikacji w polls/tests.py w tym samym katalogu co models.pyUruchomienie testw: (djangoenv)$$ ./manage.py test polls
Co testowa?
Funkcjonalno dostarczan bezporenio przez framework (np. poczenie z baz)Funkcjonalno dodan samodzielnieZmiany w domylnej funkcjonalnoci
WidokiWidoki s wywoywalne, przyjmuj danie, zwracaj odpowiedPrzewanie s to funkcje
Od wersji 1.3 mog to by rwnie klasy
Widoki generyczne
Oparte na klasachFunkcjonalno najczciej uywanych / spotykanych widokwProsty i generyczny interfejsRodzaje
wywietlenie listy obiektw danego typuwywietlenie szczegw pojedynczego obiektu danego typuwywietlenie statycznego szablonu HTMLwywietlenie i przetworzenie prostego formularza HTML
Widoki w aplikacjiLista wszystkich pyta, najlepiej uoonych w kolejnoci publikacjiWywietlenie pojedynczego pytania, pokazanie moliwych odpowiedzi oraz umoliwienie gosowaniaPrzetworzenie gosowaniaWywietlenie wynikw wszystkich gosowa po oddaniu gosu przez uytkownika
Najpierw skonfigurujmy cieki...
Routing w Django urlconfLista mapowa
regua wyraenia regularnegonazwa lub referencja na element wywoywalny (widok)moe posiada nazw (do odwracania URL-i)
Uycie django.conf.urls do tworzenia urlconfurlpatterns w pliku podanym w settings.ROOT_URLCONF
urls.py
from django.conf.urls import patterns, include, url...urlpatterns = patterns('', # lista mapowa)
Konfiguracja URL-icieki 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\d+)/$', stub, name="poll_detail"), url(r'^(?P\d+)/vote/$', stub, name="poll_vote"), url(r'^(?P\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 DjangoPodobne do Jinja2, ale bardziej ograniczoneWywietlanie 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 wcielaneBloki su do nadpisywania przez inne szablonyNie mona wykonywa dowolnych instrukcji pythonowychcieki 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.pySzablon w polls/templates/polls/list.html
Pojedyncze pytanie
Widok generyczny w polls/urls.pySzablon w polls/templates/polls/detail.htmlGosowanie zmienia dane w aplikacji (bazie) metoda POSTPodatno na atak typu Cross-Site Request ForgeryDjango middleware automatycznie przed tym chroni, ale trzeba doda znacznik {% csrf_token %} do
formularza
Cross Site Request ForgeryProblem z przesyaniem danych z nieautoryzowanego rdaCzue miejsca: ciasteczka i adres IPMoliwoci
wylogowanie uytkownikazmiana ustawie uytkownika (np. Google, Amazon)wpisanie komentarza podszywajc si za kogo innegotransfer pienidzy...
Zazwyczaj wykorzystanie JavaScriptuZapobieganie
nagwek REFERERukryte pole: funkcja skrtu lub jednorazowy cig losowy
Widoki i szablony dla aplikacji
Przetwarzanie gosowania
Dane przesyane metod POST wybr wartoci dla klucza choiceSchemat 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.pySzablon w polls/templates/polls/result.html
PodsumowanieKompleksowy framework
MVCORMtestypowokaaplikacje...
Aktywny rozwjBardzo dobra dokumentacjaOgromna spoeczno
#7: Django IMikoaj OlszewskiJakie pytania po lekturze?
Poznajcie projekt DjangoKompleksowy frameworkZaletyPrzykady uycia
Organizacja Django
Projekt DjangorodowiskoStrukturaZarzdzanieUruchomienieSerwer deweloperskiSerwer laboratoryjnyDomylna strona
Architektura DjangoMVCMVC MVTDlaczego model w kodzie?Problemy
Podczenie bazySynchronizacja bazy
PrzykadDjango tutorial
Aplikacja djangoStrukturaWczenie
ModelePowoka DjangoAPI modeluTestowanie modeluCo testowa?
WidokiWidoki generyczneWidoki w aplikacji
Routing w Django urlconfurls.pyKonfiguracja URL-i
Szablony w DjangoWidoki i szablony dla aplikacjiLista pytaPojedyncze pytanie
Cross Site Request ForgeryWidoki i szablony dla aplikacjiPrzetwarzanie gosowaniaWyniki gosowania
Podsumowanie