django (web konferencia 2009)

64
Farkas Szilveszter Magyarországi Web Konferencia Budapest, 2009. október 3.

Upload: szilveszter-farkas

Post on 14-May-2015

3.217 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Django (Web Konferencia 2009)

Farkas SzilveszterMagyarországi Web KonferenciaBudapest, 2009. október 3.

Page 2: Django (Web Konferencia 2009)

Farkas Szilveszter

Page 3: Django (Web Konferencia 2009)

Farkas Szilveszter

Page 4: Django (Web Konferencia 2009)

Farkas Szilveszter

Page 5: Django (Web Konferencia 2009)

Farkas Szilveszter

Page 6: Django (Web Konferencia 2009)

from presentation import (Django, Forms, Middleware, Tests, Python)

Page 7: Django (Web Konferencia 2009)

>>> import django

>>> django.ORIGINAL_AUTHOR'Adrian Holovaty'

>>> django.OPEN_SOURCEDdatetime.date(2005, 7, 13)

>>> django.VERSION'1.1-final'

>>> len(django.AUTHORS)485

Page 8: Django (Web Konferencia 2009)

>>> import django

>>> django.ORIGINAL_AUTHOR'Adrian Holovaty'

>>> django.OPEN_SOURCEDdatetime.date(2005, 7, 13)

>>> django.VERSION'1.1-final'

>>> len(django.AUTHORS)485

Page 9: Django (Web Konferencia 2009)

>>> import django

>>> django.ORIGINAL_AUTHOR'Adrian Holovaty'

>>> django.OPEN_SOURCEDdatetime.date(2005, 7, 13)

>>> django.VERSION'1.1-final'

>>> len(django.AUTHORS)485

Page 10: Django (Web Konferencia 2009)

>>> import django

>>> django.ORIGINAL_AUTHOR'Adrian Holovaty'

>>> django.OPEN_SOURCEDdatetime.date(2005, 7, 13)

>>> django.VERSION'1.1-final'

>>> len(django.AUTHORS)485

Page 11: Django (Web Konferencia 2009)

>>> import django

>>> django.ORIGINAL_AUTHOR'Adrian Holovaty'

>>> django.OPEN_SOURCEDdatetime.date(2005, 7, 13)

>>> django.VERSION'1.1-final'

>>> len(django.AUTHORS)485

Page 12: Django (Web Konferencia 2009)

>>> django.MODEL'model'

>>> django.VIEW'template'

>>> django.CONTROLLER'view'

Page 13: Django (Web Konferencia 2009)

$ django-admin startproject webkonf

$ cd webkonf

$ ./manage.py startapp conference

Page 14: Django (Web Konferencia 2009)

from django.db import models

class Venue(models.Model): name = models.CharField(max_length=64) address = models.CharField(max_length=128)

class Conference(models.Model): name = models.CharField(max_length=32) venue = models.ForeignKey(ConferenceVenue)

from django.contrib.auth.models import User

class Attendee(models.Model): user = models.OneToOneField(User) conferences = models.ManyToManyField( Conference, related_name='attendees')

Page 15: Django (Web Konferencia 2009)

from django.db import models

class Venue(models.Model): name = models.CharField(max_length=64) address = models.CharField(max_length=128)

class Conference(models.Model): name = models.CharField(max_length=32) venue = models.ForeignKey(Venue)

from django.contrib.auth.models import User

class Attendee(models.Model): user = models.OneToOneField(User) conferences = models.ManyToManyField( Conference, related_name='attendees')

Page 16: Django (Web Konferencia 2009)

from django.db import models

class Venue(models.Model): name = models.CharField(max_length=64) address = models.CharField(max_length=128)

class Conference(models.Model): name = models.CharField(max_length=32) venue = models.ForeignKey(Venue)

from django.contrib.auth.models import User

class Attendee(models.Model): user = models.OneToOneField(User) conferences = models.ManyToManyField( Conference, related_name='attendees')

Page 17: Django (Web Konferencia 2009)

[...]<h1>{{ conference.name }}</h1>

<h2>Látogatók</h2>

<ul>{% for attendee in conference.attendees.all %} <li>{{ attendee.user.get_full_name }}</li>{% endfor %}</ul>[...]

Page 18: Django (Web Konferencia 2009)

from django.shortcuts import (get_object_or_404, render_to_response)from conference.models import Conference

def conference_page(request, conf_id): conference = get_object_or_404( Conference, pk=conf_id) context = { 'conference': conference } return render_to_response( 'conference.html', context)

Page 19: Django (Web Konferencia 2009)

from django.conf.urls.defaults import *

urlpatterns = patterns('', (r'^/conf/(?P<conf_id>\d+)/$', 'conference.views.conference_page'),)

Page 20: Django (Web Konferencia 2009)
Page 21: Django (Web Konferencia 2009)

from django import forms

Page 22: Django (Web Konferencia 2009)

űrlapok

Page 23: Django (Web Konferencia 2009)

űrlapok

szerver oldali adatellenőrzés

Page 24: Django (Web Konferencia 2009)

Űrlap osztály

class AttendeeForm(forms.Form):

Mező

name = forms.CharField('Név', max_length=32)

Widget

password = forms.CharField( 'Jelszó', max_length=32, widget=forms.PasswordInput())

Page 25: Django (Web Konferencia 2009)

Űrlap osztály

class AttendeeForm(forms.Form):

Mező

name = forms.CharField('Név', max_length=32)

Widget

password = forms.CharField( 'Jelszó', max_length=32, widget=forms.PasswordInput())

Page 26: Django (Web Konferencia 2009)

Űrlap osztály

class AttendeeForm(forms.Form):

Mező

name = forms.CharField('Név', max_length=32)

Widget

password = forms.CharField( 'Jelszó', max_length=32, widget=forms.PasswordInput())

Page 27: Django (Web Konferencia 2009)

Beépített ellenőrzés

email = forms.EmailField(max_length=75)zip = forms.IntegerField(min_value=1000, max_value=9999)

Mezőszintű egyedi ellenőrzés

def clean_FIELDNAME(self):

Űrlapszintű egyedi ellenőrzés

def clean(self):

Page 28: Django (Web Konferencia 2009)

Beépített ellenőrzés

email = forms.EmailField(max_length=75)zip = forms.IntegerField(min_value=1000, max_value=9999)

Mezőszintű egyedi ellenőrzés

def clean_FIELDNAME(self):

Űrlapszintű egyedi ellenőrzés

def clean(self):

Page 29: Django (Web Konferencia 2009)

Beépített ellenőrzés

email = forms.EmailField(max_length=75)zip = forms.IntegerField(min_value=1000, max_value=9999)

Mezőszintű egyedi ellenőrzés

def clean_FIELDNAME(self):

Űrlapszintű egyedi ellenőrzés

def clean(self):

Page 30: Django (Web Konferencia 2009)

Mezőszintű egyedi ellenőrzés

def clean_email(self): if 'email' in self.cleaned_data: email = self.cleaned_data['email'] if not email.endswith('@web.conf.hu'): raise forms.ValidationError('Nem vagy szervező.') else: return email

Page 31: Django (Web Konferencia 2009)

from django import middlewares

Page 32: Django (Web Konferencia 2009)
Page 33: Django (Web Konferencia 2009)

process_request()

process_view()

process_response()

process_exception()

Page 34: Django (Web Konferencia 2009)

from django.http import HttpResponseRedirect

class LoginMiddleware(object): def process_request(self, request): if not request.user.is_authenticated(): if request.get_full_path() != '/login/': return HttpResponseRedirect( '/login/?next=%s' % request.get_full_path()) else: return None

Page 35: Django (Web Konferencia 2009)

from django.http import HttpResponseRedirect

class LoginMiddleware(object): def process_request(self, request): if not request.user.is_authenticated(): if request.get_full_path() != '/login/': return HttpResponseRedirect( '/login/?next=%s' % request.get_full_path()) else: return None

Page 36: Django (Web Konferencia 2009)

process_view(self, request, view_func, view_args, view_kwargs)

process_response(self, request, response)

process_exception(self, request, exception)

Page 37: Django (Web Konferencia 2009)

from django import test

Page 38: Django (Web Konferencia 2009)

doctest

class Conference(models.Model): """ >>> v = Venue.objects.create( name='CEU', address='Budapest') >>> c = Conference.objects.create( Name='WebKonf', venue=v) >>> c.name u'WebKonf' >>> c.venue.name u'CEU' """ name = models.CharField(max_length=32) venue = models.ForeignKey(Venue)

Page 39: Django (Web Konferencia 2009)

unittest

import unittest

class ConferenceTest(unittest.TestCase): def setUp(self): venue = Venue.objects.create( Name='CEU', address='Budapest') self.conf = Conference.objects.create( Name='WebKonf', venue=venue)

def test_conference(self): self.assertEquals(self.conf.name, u'WebKonf') self.assertEquals(self.conf.venue.name, u'CEU')

def tearDown(self): self.conf.delete()

Page 40: Django (Web Konferencia 2009)

from django.test import TestCase

-> kliens (GET, POST)

-> „hozzávalók” beemelése (JSON/XML dump)

-> egyedi url konfiguráció

-> e-mail fiók

-> további assert-ek

Page 41: Django (Web Konferencia 2009)

from django.test import TestCase

-> kliens (GET, POST)

def test_conference(self): response = self.client.get('/conf/1/') self.assertTrue('<h1>WebKonf</h1>' in response.content)

Page 42: Django (Web Konferencia 2009)

from django.test import TestCase

-> „hozzávalók” beemelése (JSON/XML dump)

class ConferenceTest(TestCase): fixtures = ['webkonf.json']

$ ./manage.py dumpdata conference > \conference/fixtures/webkonf.json

Page 43: Django (Web Konferencia 2009)

from django.test import TestCase

-> egyedi url konfiguráció

class ConferenceTest(TestCase): urls = 'conference.test_urls'

Page 44: Django (Web Konferencia 2009)

from django.test import TestCase

-> e-mail fiók

from django.core import maildef test_email(self): mail.send_mail('Subject', 'Message.', '[email protected]', ['[email protected]'], fail_silently=False)

self.assertEquals(len(mail.outbox), 1)

self.assertEquals(mail.outbox[0].subject, 'Subject')

Page 45: Django (Web Konferencia 2009)

from django.test import TestCase

-> további assert-ek

assertContains(response, text, count=None, status_code=200)

assertNotContains(response, text, status_code=200)

assertFormError(response, form, field, errors)

assertTemplateUsed(response, template_name)

assertTemplateNotUsed(response, template_name)

assertRedirects(response, expected_url, status_code=302, target_status_code=200)

Page 46: Django (Web Konferencia 2009)

$ python

Page 47: Django (Web Konferencia 2009)

from django.db import modelsfrom django.contrib.localflavor.us.models import USStateField

class Venue(models.Model): name = models.CharField(max_length=64) address = models.CharField(max_length=128)

class USVenue(Venue): state = USStateField(default='CA')

class ConferenceVenue(Venue): rooms = forms.PositiveIntegerField()

Page 48: Django (Web Konferencia 2009)

from django.db import modelsfrom django.contrib.localflavor.us.models import USStateField

class Venue(models.Model): name = models.CharField(max_length=64) address = models.CharField(max_length=128)

class USVenue(Venue): state = USStateField(default='CA')

class ConferenceVenue(Venue): rooms = forms.PositiveIntegerField()

Page 49: Django (Web Konferencia 2009)

from django.db import modelsfrom django.contrib.localflavor.us.models import USStateField

class Venue(models.Model): name = models.CharField(max_length=64) address = models.CharField(max_length=128)

class USVenue(Venue): state = USStateField(default='CA')

class ConferenceVenue(Venue): rooms = forms.PositiveIntegerField()

Page 50: Django (Web Konferencia 2009)

from django.db import modelsfrom django.contrib.localflavor.us.models import USStateField

class Venue(models.Model): name = models.CharField(max_length=64) address = models.CharField(max_length=128)

class Meta: abstract = True

class USVenue(Venue): state = USStateField(default='CA')

class ConferenceVenue(Venue): rooms = forms.PositiveIntegerField()

Page 51: Django (Web Konferencia 2009)

from django.contrib.auth.decorators import login_required

@login_requireddef conference_private(request):[...]

from django.utils.decorators import decorator_from_middlewarefrom conference.middleware.login import LoginMiddleware

login_required = decorator_from_middleware( LoginMiddleware)

@login_requireddef conference_private(request):[...]

Page 52: Django (Web Konferencia 2009)

from django.contrib.auth.decorators import login_required

@login_requireddef conference_private(request):[...]

from django.utils.decorators import decorator_from_middlewarefrom conference.middleware.login import LoginMiddleware

login_required = decorator_from_middleware( LoginMiddleware)

@login_requireddef conference_private(request):[...]

Page 53: Django (Web Konferencia 2009)

Modulok (csomagok)

__init__.pyconference/ __init__.py models.py templates/ conference.html views.pymanage.pysettings.pyurls.py

Page 54: Django (Web Konferencia 2009)

Modulok (csomagok)

__init__.pyconference/ __init__.py models.py templates/ conference.html views.pymanage.pyregistration/ [...]settings.pyurls.py

Page 55: Django (Web Konferencia 2009)

Modulok (csomagok)

__init__.pyconference/ __init__.py models.py templates/ conference.html views/ __init__.py attendees.py conferences.pymanage.pyregistration/ [...]settings.pyurls.py

Page 56: Django (Web Konferencia 2009)

Globális/újrahasznosítható modulok

INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.admin', 'conference',)

Page 57: Django (Web Konferencia 2009)

Globális/újrahasznosítható modulok

INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.admin', 'conference', 'django_registration',)

Page 58: Django (Web Konferencia 2009)

Globális/újrahasznosítható modulok

INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.admin', 'conference', 'django_registration', 'django_openid_auth',)

Page 59: Django (Web Konferencia 2009)

Globális/újrahasznosítható modulok

INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.admin', 'conference', 'django_registration', 'django_openid_auth', 'django_contact_form',)

Page 60: Django (Web Konferencia 2009)

from django.conf.urls.defaults import *

urlpatterns = patterns('', (r'^/conf/(?P<conf_id>\d+)/$', 'conference.views.conference_page'), (r'^openid/', include('django_openid_auth.urls')),)

Page 61: Django (Web Konferencia 2009)

Globális/újrahasznosítható modulok

django-compressordjango-contact-formdjango-db-logdjango-debug-toolbardjango-extensionsdjango-flatblocksdjango-gravatardjango-oembeddjango-openid-authdjango-proxydjango-registrationdjango-taggingdjango-timezonesdjango-tinymcedjango-votingdjango-wikiapp

Page 62: Django (Web Konferencia 2009)

Remixek

Pinax(http://pinaxproject.com/)

37 django-*

Mingus(http://github.com/montylounge/django-mingus/)

28 django-*

Page 63: Django (Web Konferencia 2009)

Hivatkozások

http://www.djangoproject.com/

http://docs.djangoproject.com/

http://gábor.20y.hu/django/

Page 64: Django (Web Konferencia 2009)