Django: formularze, sesje, testowanie

54
Kurs rozszerzony języka Python Środowisko Django, cz. 2 Marcin Mlotkowski 12 stycznia 2018

Transcript of Django: formularze, sesje, testowanie

Page 1: Django: formularze, sesje, testowanie

Kurs rozszerzony języka PythonŚrodowisko Django, cz. 2

Marcin Młotkowski

12 stycznia 2018

Page 2: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Plan wykładu

1 Administracja

2 FormularzeTrochę teoriiObsługa żądań GETObiekty formularzowe

3 RóżneZarządzanie sesjamiPolonizacja

4 TestowanieTesty jednostkoweSymulowanie klienta

Marcin Młotkowski Kurs rozszerzony języka Python

Page 3: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Plan wykładu

1 Administracja

2 FormularzeTrochę teoriiObsługa żądań GETObiekty formularzowe

3 RóżneZarządzanie sesjamiPolonizacja

4 TestowanieTesty jednostkoweSymulowanie klienta

Marcin Młotkowski Kurs rozszerzony języka Python

Page 4: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Przypomnienie

Co implementujemy

System zapisy:

wykładowcy;studenci;wykłady.

Marcin Młotkowski Kurs rozszerzony języka Python

Page 5: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Administrowanie aplikacją

settings.py

MIDDLEWARE CLASSES = (’django.middleware.common.CommonMiddleware’,’django.contrib.sessions.middleware.SessionMiddleware’,’django.contrib.auth.middleware.AuthenticationMiddleware’, )INSTALLED APPS = ( ’django.contrib.auth’,’django.contrib.contenttypes’, ’django.contrib.sessions’,’django.contrib.sites’, ’django.contrib.admin’, ’wyklad.zapisy’, )

Umożliwia zarządzanie aplikacją.

Marcin Młotkowski Kurs rozszerzony języka Python

Page 6: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Administrowanie aplikacją

settings.py

MIDDLEWARE CLASSES = (’django.middleware.common.CommonMiddleware’,’django.contrib.sessions.middleware.SessionMiddleware’,’django.contrib.auth.middleware.AuthenticationMiddleware’, )INSTALLED APPS = ( ’django.contrib.auth’,’django.contrib.contenttypes’, ’django.contrib.sessions’,’django.contrib.sites’, ’django.contrib.admin’, ’wyklad.zapisy’, )

Umożliwia zarządzanie aplikacją.

Marcin Młotkowski Kurs rozszerzony języka Python

Page 7: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Podłączenie administracji

Wyszukanie w aplikacjach informacji, czy chcą być zarządzaneprzez moduł admin.

zapisy/admin.py

from django.contrib import admin

admin.site.register(Wykladowca)admin.site.register(Student)admin.site.register(Wyklad)

Marcin Młotkowski Kurs rozszerzony języka Python

Page 8: Django: formularze, sesje, testowanie
Page 9: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Trochę teoriiObsługa żądań GETObiekty formularzowe

Plan wykładu

1 Administracja

2 FormularzeTrochę teoriiObsługa żądań GETObiekty formularzowe

3 RóżneZarządzanie sesjamiPolonizacja

4 TestowanieTesty jednostkoweSymulowanie klienta

Marcin Młotkowski Kurs rozszerzony języka Python

Page 10: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Trochę teoriiObsługa żądań GETObiekty formularzowe

Podstawowe żądania HTTP

GET

GET <ścieżka do pliku> HTTP 1.1GET <ścieżka>?query=python&subquery=django HTTP 1.1

POST

POST /login HTTP 1.1

login=adminpassword=qwerty

Marcin Młotkowski Kurs rozszerzony języka Python

Page 11: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Trochę teoriiObsługa żądań GETObiekty formularzowe

Podstawowe żądania HTTP

GET

GET <ścieżka do pliku> HTTP 1.1GET <ścieżka>?query=python&subquery=django HTTP 1.1

POST

POST /login HTTP 1.1

login=adminpassword=qwerty

Marcin Młotkowski Kurs rozszerzony języka Python

Page 12: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Trochę teoriiObsługa żądań GETObiekty formularzowe

Inne typy żądań

HEAD

PUT

DELETE

TRACE

CONNECT

OPTIONS

Marcin Młotkowski Kurs rozszerzony języka Python

Page 13: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Trochę teoriiObsługa żądań GETObiekty formularzowe

Analiza żądań

Przypomnienie: widoki

def hello(request):...

Obiekt Request, atrybuty

path, get full path() (z zapytaniem)method: może być GET bądź POSTGET, POST: podobne do słowników

Marcin Młotkowski Kurs rozszerzony języka Python

Page 14: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Trochę teoriiObsługa żądań GETObiekty formularzowe

Analiza żądań

Przypomnienie: widoki

def hello(request):...

Obiekt Request, atrybuty

path, get full path() (z zapytaniem)method: może być GET bądź POSTGET, POST: podobne do słowników

Marcin Młotkowski Kurs rozszerzony języka Python

Page 15: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Trochę teoriiObsługa żądań GETObiekty formularzowe

Kiedy GET, kiedy POST

GET

Wyświetlenie danych, bez ich zmiany (np. wyszukiwanie).

POST

Efekty uboczne: zmiana danych, wysłanie maila z formularza.

Marcin Młotkowski Kurs rozszerzony języka Python

Page 16: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Trochę teoriiObsługa żądań GETObiekty formularzowe

Składnia

<form action="/search/" method="get"><input type="text" name="query"><input type="submit" value="Szukaj"></form>

Widok: urls.py

urlpatterns = patterns(””,# ...(r”ˆsearch-form/$”, views.search form),# ...

)

Marcin Młotkowski Kurs rozszerzony języka Python

Page 17: Django: formularze, sesje, testowanie

Implementacja widoków

from django.http import HttpResponsefrom django.shortcuts import render to responsefrom mysite.zapisy.models import Wyklad

def search form(request):return render to response(’search form.html’)

def search(request):if ’query’ in request.GET and request.GET[’query’]:

query = request.GET[”query”]wyklady = Wyklad.objects.filter(tytul icontains=query)return render to response(’search results.html’,

{’wyklady’: wyklady, ’query’: query})else

return render to response(’search form.html’,{’error’: True})

Page 18: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Trochę teoriiObsługa żądań GETObiekty formularzowe

szablon search form.html

{% if error %}<p style="color: red;">Proszę zadać pytanie</p>{% endif %}<form action="/search/" method="get"><input type="text" name="query"><input type="submit" value="Szukaj"></form>

Marcin Młotkowski Kurs rozszerzony języka Python

Page 19: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Trochę teoriiObsługa żądań GETObiekty formularzowe

Obiekty formularzowe: co to takiego

obiekty, z których można łatwo wyprodukować formularzemożna konfigurować różne parametry (rozmiar pola,opcjonalność pól);weryfikacja podawanych danych

Marcin Młotkowski Kurs rozszerzony języka Python

Page 20: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Trochę teoriiObsługa żądań GETObiekty formularzowe

Obiekty formularzowe

from django import forms

class ContactForm(forms.Form):subject = forms.CharField(max length=100)email = forms.EmailField(required=False,

label=”Podaj email”)message = forms.CharField(widget=forms.Textarea)

Marcin Młotkowski Kurs rozszerzony języka Python

Page 21: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Trochę teoriiObsługa żądań GETObiekty formularzowe

Sposoby walidacji podawanych danych

class ContactForm(forms.Form):...def clean email(self):

em = self.cleaned data[’email’]if em niepoprawny :

raise forms.ValidationError(’Niepoprawny email!’)return em

Marcin Młotkowski Kurs rozszerzony języka Python

Page 22: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Trochę teoriiObsługa żądań GETObiekty formularzowe

Użycie obiektu formularza

Metody i pola obiektu

.as table: do włożenia do tabeli

.as ul: do włożenia do wyliczenia <ul>

.as p: wkłada w znaczniki <p>

Marcin Młotkowski Kurs rozszerzony języka Python

Page 23: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Trochę teoriiObsługa żądań GETObiekty formularzowe

Osadzenie formularza w szablonie

Przykład użycia

{% if form.errors %}<p style="color: red;">Popraw błędy {{ form.errors|pluralize }}.</p>{% endif %}<form action="" method="post"><table>{{ form.as_table }}</table><input type="submit" value="Submit"></form>

Marcin Młotkowski Kurs rozszerzony języka Python

Page 24: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Trochę teoriiObsługa żądań GETObiekty formularzowe

Wiązanie widoku z formularzem

from django.shortcuts import render to responsefrom mysite.contact.forms import ContactForm

def contact(request):if request.method == ’POST’:

form = ContactForm(request.POST)if form.is valid():

cd = form.cleaned dataoperacja(cd[’subject’], cd[’message’],

cd.get(’e-mail’, ’[email protected]’))return HttpResponseRedirect(’/contact/thanks/’)

elseform = ContactForm()

return render to response(’contact form.html’, {’form’: form})

Marcin Młotkowski Kurs rozszerzony języka Python

Page 25: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Trochę teoriiObsługa żądań GETObiekty formularzowe

Inicjowanie wartościami początkowymi

form = ContactForm(initial={ subject=’Mam problem’, message=’Opisz problem’})

Marcin Młotkowski Kurs rozszerzony języka Python

Page 26: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Zarządzanie sesjamiPolonizacja

Plan wykładu

1 Administracja

2 FormularzeTrochę teoriiObsługa żądań GETObiekty formularzowe

3 RóżneZarządzanie sesjamiPolonizacja

4 TestowanieTesty jednostkoweSymulowanie klienta

Marcin Młotkowski Kurs rozszerzony języka Python

Page 27: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Zarządzanie sesjamiPolonizacja

Sesje

Sesja: ciąg akcji związanych z jednym użytkownikiem; na przykładzakupy w sklepie internetowym.

Realizacja

Ciasteczka

Marcin Młotkowski Kurs rozszerzony języka Python

Page 28: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Zarządzanie sesjamiPolonizacja

Obsługa sesji w Django

Co potrzebujemy:

w MIDDLEWARE CLASSES ma być’django.contrib.sessions.middleware.SessionMiddleware’.w INSTALLED APPS ma być ’django.contrib.sessions’

Marcin Młotkowski Kurs rozszerzony języka Python

Page 29: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Zarządzanie sesjamiPolonizacja

Jak używać sesji

Atrybut request.session

Jest to atrybut zachowujący się podobnie do słowników.

Marcin Młotkowski Kurs rozszerzony języka Python

Page 30: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Zarządzanie sesjamiPolonizacja

Przykład

Logowanie

def login(request):if request.method != ’POST’:

raise Http404(’Tylko POSTs są dopuszczalne’)try:

m = User.objects.get(username=request.POST[’username’])if m.password == request.POST[’password’]:

request.session[’user id’] = m.idreturn HttpResponseRedirect(’/you-are-logged-in/’)

except User.DoesNotExist:return HttpResponse(”Nieudane logowanie :-(”)

request.session[’user id’] służy do identyfikacji, czy użytkownik jestzalogowany.

Marcin Młotkowski Kurs rozszerzony języka Python

Page 31: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Zarządzanie sesjamiPolonizacja

Przykład

Logowanie

def login(request):if request.method != ’POST’:

raise Http404(’Tylko POSTs są dopuszczalne’)try:

m = User.objects.get(username=request.POST[’username’])if m.password == request.POST[’password’]:

request.session[’user id’] = m.idreturn HttpResponseRedirect(’/you-are-logged-in/’)

except User.DoesNotExist:return HttpResponse(”Nieudane logowanie :-(”)

request.session[’user id’] służy do identyfikacji, czy użytkownik jestzalogowany.

Marcin Młotkowski Kurs rozszerzony języka Python

Page 32: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Zarządzanie sesjamiPolonizacja

Wylogowanie

def logout(request):try:

del request.session[’user id’]except KeyError:

passreturn HttpResponse(”Jesteś wylogowany”)

Marcin Młotkowski Kurs rozszerzony języka Python

Page 33: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Zarządzanie sesjamiPolonizacja

Podstawowe pojęcia

Internacjonalizacja (I18N)

Przygotowanie programu do tworzenia różnych wersji językowych.

Lokalizacja

Stworzenie wersji językowej.

Marcin Młotkowski Kurs rozszerzony języka Python

Page 34: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Zarządzanie sesjamiPolonizacja

Podstawowe pojęcia

Internacjonalizacja (I18N)

Przygotowanie programu do tworzenia różnych wersji językowych.

Lokalizacja

Stworzenie wersji językowej.

Marcin Młotkowski Kurs rozszerzony języka Python

Page 35: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Zarządzanie sesjamiPolonizacja

Włączanie/wyłączanie internacjonalizacji

USE I18N = TrueTEMPLATE CONTEXT PROCESSORS = (’django.core.context processors.i18n’)

Marcin Młotkowski Kurs rozszerzony języka Python

Page 36: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Zarządzanie sesjamiPolonizacja

Tłumaczenie napisów w widokach

from django.utils.translation import ugettext as

def widoczek(request):output = (”Welcome to my site.”)return HttpResponse(output)

Marcin Młotkowski Kurs rozszerzony języka Python

Page 37: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Zarządzanie sesjamiPolonizacja

Tłumaczenia w szablonach

Tłumaczenie pojedynczego napisu

<title>{% trans "This is the title." %}</title>

Tłumaczenie większych fragmentów

{% blocktrans %}This string will have {{ value }} inside.{% endblocktrans %}

Marcin Młotkowski Kurs rozszerzony języka Python

Page 38: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Zarządzanie sesjamiPolonizacja

Tłumaczenie

django-admin.py makemessages -l pl

tworzy plik locale/pl/LC MESSAGES/django.po. String z plikuźródłowego jest kluczem, my powinniśmy uzupełnić o tłumaczenie

Po wpisaniu tłumaczeń

Kompilacja: django-admin.py compilemessages

Marcin Młotkowski Kurs rozszerzony języka Python

Page 39: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Zarządzanie sesjamiPolonizacja

Tłumaczenie

django-admin.py makemessages -l pl

tworzy plik locale/pl/LC MESSAGES/django.po. String z plikuźródłowego jest kluczem, my powinniśmy uzupełnić o tłumaczenie

Po wpisaniu tłumaczeń

Kompilacja: django-admin.py compilemessages

Marcin Młotkowski Kurs rozszerzony języka Python

Page 40: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Testy jednostkoweSymulowanie klienta

Plan wykładu

1 Administracja

2 FormularzeTrochę teoriiObsługa żądań GETObiekty formularzowe

3 RóżneZarządzanie sesjamiPolonizacja

4 TestowanieTesty jednostkoweSymulowanie klienta

Marcin Młotkowski Kurs rozszerzony języka Python

Page 41: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Testy jednostkoweSymulowanie klienta

Poziomy testowania

Testy jednostkowe

Patrz: wykład 9: unittest

Testy klienckie

Symulacja działania przeglądarki.

Marcin Młotkowski Kurs rozszerzony języka Python

Page 42: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Testy jednostkoweSymulowanie klienta

Poziomy testowania

Testy jednostkowe

Patrz: wykład 9: unittest

Testy klienckie

Symulacja działania przeglądarki.

Marcin Młotkowski Kurs rozszerzony języka Python

Page 43: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Testy jednostkoweSymulowanie klienta

Mała sugestia

Zamiast

import unittest

lepiej

from django.test import TestCase

Marcin Młotkowski Kurs rozszerzony języka Python

Page 44: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Testy jednostkoweSymulowanie klienta

Różnice między unittest a django.test

automatyczne ładowanie danych testowych do bazy testowej;

Każdy test jest odrębną transakcją;

dodatkowe asercje do testowania HTML’a, przekierowańHTTP, etc.

Marcin Młotkowski Kurs rozszerzony języka Python

Page 45: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Testy jednostkoweSymulowanie klienta

Przykład

from django.test import TestCasefrom wyklad.zapisy.models import Wyklad

class WykladTestCase(TestCase):def setUp(self):

Wyklad.objects.create(nazwa=’Python’, ects=3)

def test zapisu(self):py = Wyklad.objects.get(nazwa=’Python’)self.assertEqual(py.ects, 3)

./manage.py test

Wyszukuje wszystkie pliki test*.py i traktuje je jako elementyzestawu testów.

Marcin Młotkowski Kurs rozszerzony języka Python

Page 46: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Testy jednostkoweSymulowanie klienta

Przykład

from django.test import TestCasefrom wyklad.zapisy.models import Wyklad

class WykladTestCase(TestCase):def setUp(self):

Wyklad.objects.create(nazwa=’Python’, ects=3)

def test zapisu(self):py = Wyklad.objects.get(nazwa=’Python’)self.assertEqual(py.ects, 3)

./manage.py test

Wyszukuje wszystkie pliki test*.py i traktuje je jako elementyzestawu testów.

Marcin Młotkowski Kurs rozszerzony języka Python

Page 47: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Testy jednostkoweSymulowanie klienta

Testowa baza danych

Testowa baza danych (test baza produkcyjna ) jest czyszczonapo każdym teście.

Marcin Młotkowski Kurs rozszerzony języka Python

Page 48: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Testy jednostkoweSymulowanie klienta

Dane testowe

Dane testowe z istniejącej bazy danych:

manage.py syncdb

tworzy plik initial data z danymi

Te dane są domyślnie ładowane podczas testów.

Marcin Młotkowski Kurs rozszerzony języka Python

Page 49: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Testy jednostkoweSymulowanie klienta

Inne dane testowe

from django.test import TestCasefrom wyklad.zapisy.models import Wyklad

class WykladTestCase(TestCase):fixtures = [’jesien.json’, ’wiosna’]...

Marcin Młotkowski Kurs rozszerzony języka Python

Page 50: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Testy jednostkoweSymulowanie klienta

Klient testowy

django.test.client.Client

Symuluje wysyłanie zapytań GET/POST.

Można też używać narzędzi typu Selenium.

Marcin Młotkowski Kurs rozszerzony języka Python

Page 51: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Testy jednostkoweSymulowanie klienta

Klient testowy

django.test.client.Client

Symuluje wysyłanie zapytań GET/POST.

Można też używać narzędzi typu Selenium.

Marcin Młotkowski Kurs rozszerzony języka Python

Page 52: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Testy jednostkoweSymulowanie klienta

Przykład scenariusza

from django.test.client import Clientstudent = Client()response = student.post(’/login/’,

{’username’: ’i123456’, ’password’: ’123456’})print response.status code # 200response = student.get(’/student/profil/’)print response.content

Marcin Młotkowski Kurs rozszerzony języka Python

Page 53: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Testy jednostkoweSymulowanie klienta

Uwagi

Scenariusze można opakować w przypadki testowe i korzystać zdodatkowych asercji z django.test.TestCase

django dostarcza specjalizowanych klas do implementacji różnychtestów wraz z sugestiami w jakich sytuacjach ich używać.

Marcin Młotkowski Kurs rozszerzony języka Python

Page 54: Django: formularze, sesje, testowanie

AdministracjaFormularzeRóżne

Testowanie

Testy jednostkoweSymulowanie klienta

Uwagi

Scenariusze można opakować w przypadki testowe i korzystać zdodatkowych asercji z django.test.TestCase

django dostarcza specjalizowanych klas do implementacji różnychtestów wraz z sugestiami w jakich sytuacjach ich używać.

Marcin Młotkowski Kurs rozszerzony języka Python