Programowanie Komponentowe: #8 Django II

download Programowanie Komponentowe: #8 Django II

of 10

description

Kompleksowe frameworki webowe na przykładzie Django. Część 2.

Transcript of Programowanie Komponentowe: #8 Django II

  • #8: Django IIMikoaj Olszewski

    Jakie pytania po lekturze?

    In [1]: from django.conf import settingssettings.configure()

    FormularzePodstawa interaktywnych stron

    Googlekomentarzeamerykaska wiza

    Pozyskanie danych od uytkownikaPrzetwarzanie

    walidacjaskadowaniedecyzja przekierowanie

    Komunikat

    Formularz kontaktowycontact/templates/contact/form.html

    {% if errors %}

  • {% for error in errors %} {{ error }} {% endfor %} {% endif %} {% csrf_token %} Temat: Adres e-mail (opcjonalny): Wiadomo: {{ message }}

    Widok dla formularza kontaktowegocontact/views.py

    In [2]: def contact(request): errors = [] if request.method == 'POST': subject = request.POST.get('subject', '') if not subject: errors.append('Wprowad temat.') message = request.POST.get('message', '') if not message: errors.append('Wprowad wiadomo.') email = request.POST.get('email') if email and '@' not in request.POST['email']: errors.append('Wprowad prawidowy adres e-mail.') if not errors: send_mail( request.POST['subject'], request.POST['message'], request.POST.get('email', '[email protected]'), ['[email protected]'], ) return HttpResponseRedirect('/contact/thanks/') return render_to_response('contact/form.html', locals())

    Formularze Django

  • django.formsWidety HTMLPola z walidacjFormularz jako kolekcja plRenderowanie formularzaWasna walidacja

    Formularz kontaktowy inaczejcontact/forms.pycontact/templates/contact/form.htmlcontact/views.py

    In [3]: def contact(request): if request.method == 'POST': # formularz zosta przesany form = ContactForm(request.POST) # powizanie formularza z przesanymi danymi if form.is_valid(): # pomylna walidacja # przetworzenie danych w form.cleaned_data # ... return HttpResponseRedirect('/contact/thanks/') # przekierowanie !!! else: form = ContactForm(initial={ 'subject': u'Ta strona jest wietna!' }) # nowy formularz return render_to_response('contact/form.html', locals())

    Ulepszanie wyglduul.errorlistElementy formularza

    {{ form.fieldname }}{{ form.fieldname.errors }}{{ form.fieldname.label }}{{ form.fieldname.value }}...

    Podglddjango.contrib.formtools do settings.INSTALLED_APPScontact/urls.pycontact/views.py

  • Formularze dla modelidjango.forms.ModelFormKonwersja plblank=True required=Falseverbose_name labelsave()polls/forms.pypolls/urls.pypolls/templates/polls/form.html

    Panel administracyjnyKiller feature automatyczny CRUDRegua pareto: 80/20Aplikacja Django

    Uruchomieniedjango.contrib.admin w settings.INSTALLED_APPS./manage.py syncdburls.pyhttp://localhost:8000/admin

    Rejestracja aplikacji w panelupolls/admin.py

    Dostrajanie narzdziaadmin.site.register(Model, ModelAdmin)Pola i filtry dla listy w polls/admin.pyInlineModelAdmin w polls/admin.pyUszczegowienie pl w polls/models.py

    Autentykacja i Autoryzacja

    Ciasteczka

  • In [4]: def show_color(request): if "color" in request.COOKIES: return HttpResponse("Twj kolor to %s" % request.COOKIES["color"]) else: return HttpResponse("Nie wybrae swojego koloru.")

    def set_color(request): if "color" in request.GET: response = HttpResponse("Wybrae kolor %s" % request.GET["color"]) response.set_cookie("color", request.GET["color"]) return response else: return HttpResponse("Nie podae koloru.")

    max_age, expirespath, domainsecure

    Sesjadjango.contrib.sessions.middleware.SessionMiddlewaredjango.contrib.sessions

    In [5]: def show_color(request): if "color" in request.session: return HttpResponse("Twj kolor to %s" % request.session["color"]) else: return HttpResponse("Nie wybrae swojego koloru.")

    def set_color(request): if "color" in request.GET: response = HttpResponse("Wybrae kolor %s" % request.GET["color"]) request.session["color"] = request.GET["color"] return response else: return HttpResponse("Nie podae koloru.")

    Konguracja sesjitestowe ciasteczko

  • request.session.set_test_cookie()request.session.test_cookie_worked()request.session.delete_test_cookie()

    SESSION_SAVE_EVERY_REQUESTSESSION_EXPIRE_AT_BROWSER_CLOSESESSION_COOKIE_AGESESSION_COOKIE_DOMAINSESSION_COOKIE_NAMESESSION_COOKIE_SECURE

    Django A/AModele

    uytkownicy (User)grupy (Group)uprawnienia (Permission)wiadomoci (Message)

    Sesje uytkownika (oparte o ciasteczka)django.contrib.authdjango.contrib.auth.middleware.AuthenticationMiddleware

    Uytkownikrequest.userPola

    username, first_name, last_name, email, passwordis_staff, is_superuser, last_login, date_jonedgroups, permissions

    Metodyis_authenticated(), is_anonymous()get_full_name()set_password(passwd), check_password(passwd)get_group_permissions(), get_all_permissions()has_perm(perm), has_perms(perm_list), has_module_perms(app_label)get_and_delete_messages(), email_user(subj, msg)

    Logowanie i wylogowanie

    In [6]: from django.contrib import auth

    def login(request): username = request.POST.get('username', '') password = request.POST.get('password', '')

  • user = auth.authenticate(username=username, password=password) if user is not None and user.is_active: auth.login(request, user) return HttpResponseRedirect("/account/loggedin/") else: return HttpResponseRedirect("/account/invalid/")

    def logout(request): auth.logout(request) return HttpResponseRedirect("/account/loggedout/")

    Domylne widokilogin, logout, logout_then_loginpassword_change, password_change_donepassword_reset, password_reset_done, password_reset_confirm, password_reset_complete

    In [7]: from django.conf.urls import patternsfrom django.contrib.auth.views import login, logout

    urlpatterns = patterns('account.views', (r'^login/$', login), (r'^logout/$', logout),)

    Ograniczanie dostpu

    In [8]: def my_view(request): if not request.user.is_authenticated(): return HttpResponseRedirect('/accounts/login/?next=%s' % request.path) # ...

    Dekorator

    In [9]: from django.contrib.auth.decorators import login_required

    @login_requireddef my_view(request): # ... pass

  • Ograniczanie na podstawie uprawnie

    In [10]: def my_view(request): if not request.user.has_perm('news.can_vote'): return HttpResponse("Nie moesz gosowa") # ...

    Dekoratory

    In [11]: from django.contrib.auth.decorators import user_passes_test

    @user_passes_test(lambda u: u.has_perm('news.can_vote'))def my_view(request): # ... pass

    In [12]: from django.contrib.auth.decorators import permission_required

    @permission_required('news.can_vote')def my_view(request): # ... pass

    Rejestracja

    In [13]: from django.contrib.auth.forms import UserCreationForm

    def register(request): if request.method == 'POST': form = UserCreationForm(request.POST) if form.is_valid(): new_user = form.save() return HttpResponseRedirect("/") else: form = UserCreationForm() context = { 'form': form, } return render_to_response("accounts/register.html", context)

    UprawnieniaDomylne

  • django.contrib.authDla kadego modelu

    add (np. polls.add_poll)change (np. polls.change_poll)delete (np. polls.delete_poll)

    Wasnefrom django.db import models

    class Poll(models.Model): ...

    class Meta: permissions = (("can_vote", "Moe gosowa"), )

    PodsumowaniePrzetwarzanie danych

    pobieraniewalidacjazapisanie

    Duo wicej moliwocizbiory formularzyformularze wieloczciowedoczane media

    Panel administracyjnyoperacje CRUDwspdziaanie z formularzamielastycznoakcjefiltrywyszukiwanie

    Wicej moliwocinadpisywanie szablonwwiele paneligenerator dokumentacji

    A/Asesjasystem uytkownikw, grup i pozwoledomylne widokiwasna rejestracjaelastyczno

  • #8: Django IIMikoaj OlszewskiJakie pytania po lekturze?

    FormularzeFormularz kontaktowyWidok dla formularza kontaktowego

    Formularze DjangoFormularz kontaktowy inaczejUlepszanie wyglduPodgld

    Formularze dla modeli

    Panel administracyjnyUruchomienieRejestracja aplikacji w paneluDostrajanie narzdzia

    Autentykacja i AutoryzacjaCiasteczkaSesjaKonfiguracja sesji

    Django A/AUytkownikLogowanie i wylogowanieDomylne widoki

    Ograniczanie dostpuDekorator

    Ograniczanie na podstawie uprawnieDekoratory

    RejestracjaUprawnieniaDomylneWasne

    Podsumowanie