Slide 1

Slide 1 text

Python i Django Szybkie i łatwe tworzenie aplikacji webowych 4developers'09 Marcin Mierzejewski // www.zenzire.com

Slide 2

Slide 2 text

Agenda Python: Django: • cechy • historia • przykłady • cechy • architektura • przykład

Slide 3

Slide 3 text

Python Guido van Rossum, 1990 Interpreter Paradygmanty: • strukturalny • obiektowy • funkcyjny Czytelność kodu

Slide 4

Slide 4 text

Python. Open Source Platformy: • Windows • Linux • ... Implementacja: CPython, JPython, IronPython, PyPy, Psyco

Slide 5

Slide 5 text

Interpreter ~$ python >>> print 'hello 4developers' hello 4developers >>> tekst = 'Python i Djnago' >>> print tekst[0] P >>> print tekst[:6], tekst[-6:] Python Django >>> print tekst[9:11] * 3 DjDjDj

Slide 6

Slide 6 text

Strukturalny a = 10 if a > 5: print 'większe' else: print 'mniejsze' for i in ['A', 'be', 3, 4.5, True]: print i

Slide 7

Slide 7 text

Obiektowy class A: def funkcja_a(self): print 'A' class B(A): def funkcja_b(self): self.funkcja_a() print 'B' a = A() a.funkcja_a() ----------> A b = B() b.funkcja_b() ----------> A B

Slide 8

Slide 8 text

Funkcyjny def silnia(x): if x == 0: return 1 else: return x * silnia(x-1) silnia(10) silnia = lambda x: (1 if x == 0 else x * silnia(x-1)) silnia(10)

Slide 9

Slide 9 text

Django Framework do szybkiego i łatwego tworzenia aplikacji webowych

Slide 10

Slide 10 text

Historia 2003: Kansas, USA 2005: BSD i v0.90 2006: v0.95 2007: v0.96 2008: Fundacja i v1.0 2009: EuroDjango

Slide 11

Slide 11 text

Cechy Dokumentacja Serwer HTTP ORM URL dispatcher Szablony Interaktywna konsola

Slide 12

Slide 12 text

Cechy Panel Administracyjny Formularze Middleware i Sygnały Uwierzytelnianie i Autoryzacja i18n i L10n Cache

Slide 13

Slide 13 text

Architektura MVC (MTV Model Template View) Model - dane View (widok) - logika Template (szablon) - prezentacja

Slide 14

Slide 14 text

Architektura Przeglądarka Baza Danych URL Szablon Model Widok

Slide 15

Slide 15 text

Model Przeglądarka Baza Danych URL Szablon Model Widok

Slide 16

Slide 16 text

Model SQL Free ORM Relacje API

Slide 17

Slide 17 text

Model class Kategoria(models.Model): nazwa = models.CharField(max_length=200) slug = models.SlugField(unique=True) class Wpis(models.Model): tytul = models.CharField(max_length=200) slug = models.SlugField(unique=True) tresc = models.TextField() data = models.DateTimeField(default=datetime.now) kategorie = models.ManyToManyField(Kategoria)

Slide 18

Slide 18 text

Model API >>> kategoria = Kategoria(slug='django', nazwa='Django') >>> kategoria.save() >>> print kategoria.nazwa U'Django' >>> kategorie = Katregoria.objects.all() >>> kategorie = Katregoria.objects.filter(slug='django') >>> kategorie [] >>> wpis = Wpis(slug='witam', tytul='Witam', tresc='') >>> wpis.save() >>> wpis.kategorie.add( kategorie[0] ) >>> print wpis.kategorie.all() []

Slide 19

Slide 19 text

Widok Przeglądarka Baza Danych URL Szablon Model Widok

Slide 20

Slide 20 text

Widok def wpis_lista(request): wpisy = Wpis.objects.all()[:5] return render_to_response('lista.html', \ {'wpisy': wpisy}) def wpis_szczegoly(request, slug): wpis = get_object_or_404(Wpis, slug = slug) return render_to_response('szczegoly.html', \ {'wpis': wpis})

Slide 21

Slide 21 text

Szablon Przeglądarka Baza Danych URL Szablon Model Widok

Slide 22

Slide 22 text

Szablon {{ zmienne }}, {% tagi %} i {{ zmienne|filtry }} Mój blog {% for wpis in wpisy %}

{{ wpis.tytul|upper }}

{{ wpis.tresc }}
Opublikowano {{ wpis.data|date:"d F Y" }}, link. {% endfor %}

Slide 23

Slide 23 text

URL Przeglądarka Baza Danych URL Szablon Model Widok

Slide 24

Slide 24 text

URL # http://mojastrona.pl/4developers/ (r'^(?P[-\w]+)/$', 'blog.views.wpis_szczegoly'), # http://mojastrona.pl/ (r'^$', 'blog.views.wpis_lista'),

Slide 25

Slide 25 text

Architektura Przeglądarka Baza Danych URL Szablon Model Widok

Slide 26

Slide 26 text

Przykład Lista wpisów Szczegóły Panel administracyjny Użytkownicy

Slide 27

Slide 27 text

Projekt # django-admin.py startproject projekt projekt/ __init__.py manage.py settings.py [1] urls.py [2] [1] [2] DATABASE_ENGINE from django.contrib import admin DATABASE_NAME admin.autodiscover() INSTALLED_APPS = ( ... (r'^admin/(.*)', include('admin.site.root')) 'django.contrib.admin'

Slide 28

Slide 28 text

Tabele projekt# manage.py syncdb Creating table auth_permission Creating table auth_group Creating table auth_user Creating table auth_message Creating table django_content_type Creating table django_session Creating table django_site ......................... projekt# manage.py runserver Validating models... 0 errors found Django version 1.0-final-SVN-unknown, .......... Development server is running at http://127.0.0.1:8000/ Quit the server with CTRL-BREAK.

Slide 29

Slide 29 text

Panel Administracyjny http://127.0.0.1:8000/admin/

Slide 30

Slide 30 text

Blog projekt# manage.py startapp blog projekt/ settings.py ← INSTALLED_APPS = ( ... ... 'blog',) blog/ __init__.py models.py views.py

Slide 31

Slide 31 text

models.py projekt/blog/models.py class Wpis(models.Model): tytul = models.CharField(max_length=200) slug = models.SlugField(unique=True) tresc = models.TextField() data = models.DateTimeField(default=datetime.now) def __unicode__(self): return u'%s' % self.tytul admin.site.register(Wpis)

Slide 32

Slide 32 text

models.py projekt# manage.py syncdb projekt# manage.py runserver

Slide 33

Slide 33 text

views.py projekt/blog/views.py def wpis_lista(request): wpisy = Wpis.objects.all().order_by('-data')[:5] return render_to_response('lista.html', \ {'wpisy': wpisy}) def wpis_szczegoly(request, slug): wpis = get_object_or_404(Wpis, slug = slug) return render_to_response('szczegoly.html', \ {'wpis': wpis})

Slide 34

Slide 34 text

urls.py projekt/urls.py: (r'^(?P[-\w]+)/$', 'blog.views.wpis_szczegoly'), (r'^$', 'blog.views.wpis_lista'),

Slide 35

Slide 35 text

Szablony projekt/template/lista.html {% for wpis in wpisy %}

{{ wpis.tytul|upper }}

{{ wpis.tresc }}
Opublikowano {{ wpis.data|date:"d F Y" }}
Link {% endfor %} projekt/template/szczegoly.html

{{ wpis.tytul|upper }}

{{ wpis.tresc }}
Opublikowano {{ wpis.data|date:"d F Y" }}

Slide 36

Slide 36 text

Gotowe http://127.0.0.1:8000/ http://127.0.0.1:8000/4developers-2008

Slide 37

Slide 37 text

Statystyki views.py + models.py + settings.py + urls.py = 30 LoC lista.html + szczegoly.html = 17 LoC

Slide 38

Slide 38 text

Dziękuję Zapraszam na stronie: http://www.djangoproject.com/

Slide 39

Slide 39 text

Zdjęcia http://www.flickr.net/photos/ecstaticist/1340787730/ http://www.flickr.net/photos/schoffer/196079076/ http://www.flickr.net/photos/kogakure/2225768345/ http://www.flickr.net/photos/hotsaucejane/2385963623/ http://www.flickr.net/photos/mag-cafe/163556150/ http://www.flickr.net/photos/pauliogeordio/2301563705/ http://www.flickr.net/photos/origomi/345911878/ http://www.flickr.net/photos/ravages/2831688538/ http://www.flickr.net/photos/dizzygirl/125328389/