Programowanie w Internecie: #7 Django I

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