SlideShare a Scribd company logo
The Web framework for perfectionists with
              deadlines.
Filosofie
●   Loose coupling
●   Quick Development
●   Don't Repet Yourself (DRY)
●   Batteries included :)
Součásti
●   URL resolver
●   ORM
●   Forms
●   Templates
●   Test framework
●   Contrib aplikace
    – auth, admin, sessions, formtools
●   Reusable aplikace, Pinax
Terminologie
●   Model – objekt v DB (User, Article)
●   View – kód obstarávající logiku (list_users(),
    add_article())
●   Template – šablona presentace (user_list.html)
●   Projekt – skupina aplikací, definuje DB a spol.
    (portal, blog), reprezentuje jeden web
●   Aplikace – skupina modelů a přidružených
    objektů, může žít mimo projekt ( comments,
    galleries,articles)
Core
Základ systému se stará o:
●   Interakci s web serverem
    –   mod_python, FastCGI, WSGI
●   Zabalení HTTP požadavku/odpovědi
●   Háčky pro uchycení vlastního kódu
    –   signals   – události, na které se dá navázat
    –   middleware – umožňuje vsunout kód do
        různých částí cyklu
Views
●   Libovolná funkce přijímající HttpRequest a
    vracející HttpResponse
def hello_world( request ):
      return HttpResponse( "Hello world!" )


def working( request, id )
      return HttpResponse(
          str(get_object_or_404(Author, pk=id))
      )
URL Resolver (1)
●   Překládá URL do volání view
●   Mapování pomocí regulárních výrazů
    –   skupiny v reg. výrazech obsahují parametry
        funkce
urlpatterns = patterns('user_app',
    url(r'^$', 'list', ),
    url(r'^user/(d+)/$','detail',
          {'t':'u.html'}),
    url(r'^groups/',include('user_app.urls')),
)
URL Resolver (2)

●   Parametry v URL umožňují pěkné adresy
    –   /mail/vokurka/inbox/page3/
●   Parametry v urlpatterns pomáhají u obecných
    funkcí
●
    include()   pomáhá s modularizací
●   Lze mapovat i zpětně (view -> URL)
ORM (1)

●   PostgreSQL, MySQL, SQLite, Oracle ...
●   Umožňuje deklarativní definici modelů
●   Podporuje dědičnost (čistě)
●   Django samo vytvoří DB schéma
●   Lazy evaluace dotazů
ORM (2) - model
class User( models.Model ):
    name = models.CharField(maxlength=100,
                  unique=True)
    email = models.EmailField(blank=True)
    photo = models.ImageField(
                upload_to='img', blank=True)
    created = models.DateTimeField(
                  default=datetime.now)
    group = models.ForeignKey(Group,
                  blank=True, null=True)

   class Meta:
       ordering = ['name', '-email']
       verbose_name = 'User of our system'
ORM (3) - basic

>>> user = User( name='vomacka' )
>>> user.save()
>>> user.id
1
>>> user.created.year, user.created.month
(2007, 2)
ORM (4) - queryset
>>> qset = User.objects.all()
>>> qset = qset.filter( name__contains='vom')
>>> qset = qset.filter( group__isnull=False,
                     group__created__gt=now() )
>>> qset = qset.order_by( 'created' )
>>> qset.get( pk=1 )
<User: 1>
>>> qset = qset.exclude( name='vokurka' )
>>> qset[:5]
[<User: 1>]
>>> qset.values('email')
[{'email' : 'vomacka@centrum.cz'}]
Templates (1)
Jednoduchý značkovací jazyk:
 {% extends "base.html" %}
 {% block main %}
   {% if user %}
     {{ user.name }}, today is {% now "l" %}.
   {% else %}
     Stranger, this month is {% now "F" %}
   {% endif %}

   {% for obj in object_list %}
     {{ object|escape|urlize }}<br />
   {% endfor%}
 {% endblock %}
Templates (2)
●   Založený na dědičnosti (include lze také)
●   Využívá proměnné ({{ ... }}) a tagy ({% … %})
    –   {{ prom.x }}   vyzkouší prom.x, prom.x() a
        prom[x]
●   Proměnné lze přeložit pomocí filtrů
    {{ user.created|date:"F Y" }}
●   Soubory se hledají dle konfigurace, například:
      v adresáři templates/ v projektu a aplikacích
      v databázi
      přes HTTP z jiného serveru
Forms (1)

●   Deklarativní popis formuláře
●   Postará se o validaci a „vyčištění“ dat
●   Možnost vygenerovat formulář pro Model
class MyForm( forms.Form ):
  email = forms.EmailField( required=False )
  choice = forms.ChoiceField(
           choices=[(1,'one'), (2,'two')] )
Forms (2)
Template (easy verze)
  <form action="." method="POST">
    <table>{{ form.as_table }}</table>
    <input type="submit" />
  </form>
View
def my_view( request ):
  if request.method == 'POST':
      form = MyForm( request.POST )
  else: form = MyForm()
  if form.is_valid():
    form.cleaned_data['email']
    return HttpResponseRedirect('/')
  return render_to_response('template.html',
                 {'form' : form})
Další součásti
●   Sessions
●   Auth
●   Generic Views
●   Admin
●   Syndication
●   GeoDjango
●   Comments
●   ...
Generic Views (1)
Některé jednoduché věci se dělají stále dokola:
●   Přidání/úprava/odstranění objektu
●   Výpis seznamu/podrobností
●   Archiv
Django pro ně nabízí hotové view, kterým stačí
 nastavit parametry
Generic Views (2)
urls.py:
(r'list/$', 'object_list', {'queryset' : qset,
  'paginate_by' : 20} ),

(r'(?P<object_id>d+)/$'), 'object_detail',
  {'queryset' : qset} ),

(r'add/$', 'create_object', {'model' : Model,
  'template_name' : 'model_form.html'} ),

(r'(?P<object_id>d+)/edit/$'), 'update_object',
  {'model' : Model} ),

(r'(?P<object_id>d+)/delete/$'), 'delete_object',
  {'model' : Model} ),
Sessions
●   Přídavná aplikace starající se o zprávu session
    proměnných
●   Ve view viditelné jako request.session
●   Implementováno několik backendů ( cache,
    db, ...), do request se dostane přes middleware
●   Umožňuje ukládání libovolného obsahu
    (autoatická serializace)
Auth
●   Stará se o autentifikaci a autorizaci uživatelů
●   Možno použít libovolný backend
●   Automaticky vytvoří ADD/UPDATE a DELETE práva
    k modelům
●   Součástí je middleware, který udržuje user v
    request.user (používá ↑sessions)

    >>> user.is_authenticated()
    True
    >>> user.has_perm('some_perm')
    True
    >>> user.password
    u'sha1$9bb2c$154ecb89654d90a50869c9f115...'
Admin (1)
●   Používá auth pro správu uživatelů a práv
    – Uživatel musí mít is_staff
    – Modely, na které nemá právo ani nevidí
●   Umožňuje jednoduché manipulace s objekty
        CREATE/UPDATE/DELETE
●   Poskytuje i základní dokumentaci k projektu
Admin (2)

class Author( models.Model ):
    name = …
class AuthorOptions(admin.ModelAdmin):
    list_display = ('name', 'surname', 'created' )
    list_filter = ('created', 'site' )
    search_fields = ('name','surname','site__title')
    fields = (
      (None, {'fields':(('name','surname'), 'email'}),
    )
admin.site.register(Author, AuthorOptions)
GeoDjango

●   Podpora pro práci s geografickými daty
●   MySQL, Postgres, SQLite, Oracle…
●   Spatial queries
●   Map widget
Reusable Aplikace

●   Znovupoužitelné aplikace pro každý den:
    –  Celery (task queues)
     – Haystack (fulltext s ruznými backendy)
     – Taggit (tagging)
     – Mailer
●   Pinax
Zdroje
●   http://www.djangobook.com/
●   http://code.djangoproject.com/
●   http://docs.djangoproject.com/
●   Mailing listy
    –   django-users, django-cs a django-developers
        @googlegroups.com
●   IRC: #django on freenode.net
?
Google App Engine
App hosting
●   Uživatel vůbec nevidí HW
●   Nahraje jen aplikaci a používá služby
●   Aplikace v Pythonu nebo Javě (JVM)
●   Platí se za spotřebované prostředky:
       –   Bandwidth
       –   CPU time
       –   Storage
       –   API calls
Služby
●   Static files      ●   URL Fetch
●   Data Store        ●   Google accounts
●   memcached         ●   Cron jobs
●   Mail              ●   Tasks
●   XMPP              ●   Blobstore
●   Images
Data store
●   NOSQL databáze (GQL)
●   Definice modelů, entit, podobně jako v
    Djangu
●   Omezené možnosti dotazů
Models
from google.appengine.ext import db
from google.appengine.api import users
class Employee(db.Model):
  name = db.StringProperty(required=True)
  role = db.StringProperty(required=True,
    choices=set(["executive", "manager",]))
  hire_date = db.DateProperty()
  account = db.UserProperty()

e = Employee(
  name="",
  role="manager",
  account=users.get_current_user())
e.put()
GQL
from google.appengine.api import users

training_registration_list = [
  users.User("Alfred.Smith@example.com"),
  users.User("jharrison@example.com"),
  users.User("budnelson@example.com")]
employees = db.GqlQuery("""
     SELECT *
     FROM Employee
     WHERE account IN :1
  """,
  training_registration_list)
for e in employees: ...
Queries
q = Person.all()
q.filter("last_name =", "Smith")
q.filter("height <", 72)
q.order("-height")

q = db.GqlQuery("""
    SELECT * FROM Person
    WHERE
      last_name = :1 AND height < :2
    ORDER BY height DESC
  """,
  "Smith", 72)
Django on GAE

●   GAE má built-in django 0.96, 1.0 a 1.1
    –  Čisté django, tedy bez modelu, auth a admin
●   djangoappengine (django-nonrel)
    – Funkční admin
●   Django NOSQL GSOC
?
Děkuji za pozornost




E-mail: honza.kral@gmail.com
Twitter: @honzakral

More Related Content

PDF
Drupal Front-end
PDF
Rozšiřujeme jQuery aneb proč si nenapsat plugin?
PDF
Doctrine ORM & model
PPTX
201502.ReinIT.Dev
PDF
Kdyby/Events #posobota
PDF
Nette framework - How to compile an extensible di container
PPTX
Clean code
PPTX
MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)
Drupal Front-end
Rozšiřujeme jQuery aneb proč si nenapsat plugin?
Doctrine ORM & model
201502.ReinIT.Dev
Kdyby/Events #posobota
Nette framework - How to compile an extensible di container
Clean code
MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)

Similar to Django (20)

PDF
Content Management Framework Drupal aneb 80% webu za pár hodin. Hodí se i pro...
PPTX
TNPW2-2012-07
ODP
Představení Ruby on Rails
PDF
Ajaxujme přátelé
PPTX
TNPW2-2013-07
PDF
Úvod do rails
PDF
DEV Čtvrtkon #107 - Štefan Földesi
PDF
node.js: zápisky z fronty (Battle guide to node.js)
PPTX
Webové technologie
PPTX
TNPW2-2014-05
PDF
Read model & CQRS
PPTX
TNPW2-2016-05
PPTX
Petr Nikolas Prokop - Symfony framework (0. sraz přátel Symfony v Hradci Král...
PDF
Smalltalk prakticky [CZ]
PPTX
Čtvrtkon #71 - Marian Benčat - Angular a NativeScript
PDF
Google App Engine
PDF
Moderní Server Side UI Rendering v PHP
PDF
JSON API: Možná nepotřebujete GraphQL
PDF
Martin Zeman - Moje první aplikace v Symfony 3 (4. sraz přátel Symfony v Praze)
PDF
Moje první aplikace v Symfony 3 + překvapení (4. sraz přátel Symfony v Praze)
Content Management Framework Drupal aneb 80% webu za pár hodin. Hodí se i pro...
TNPW2-2012-07
Představení Ruby on Rails
Ajaxujme přátelé
TNPW2-2013-07
Úvod do rails
DEV Čtvrtkon #107 - Štefan Földesi
node.js: zápisky z fronty (Battle guide to node.js)
Webové technologie
TNPW2-2014-05
Read model & CQRS
TNPW2-2016-05
Petr Nikolas Prokop - Symfony framework (0. sraz přátel Symfony v Hradci Král...
Smalltalk prakticky [CZ]
Čtvrtkon #71 - Marian Benčat - Angular a NativeScript
Google App Engine
Moderní Server Side UI Rendering v PHP
JSON API: Možná nepotřebujete GraphQL
Martin Zeman - Moje první aplikace v Symfony 3 (4. sraz přátel Symfony v Praze)
Moje první aplikace v Symfony 3 + překvapení (4. sraz přátel Symfony v Praze)
Ad

More from Tomáš Holas (7)

PDF
Gwt frameworky GXT + UJORM
PDF
Úvod do OOP
ODP
Ondra Kučera: Otevřený web a jeho současný stav
PDF
Základy GWT
PDF
CZNIC: Správa internetu, routing a IPv6
PDF
Google App Engine - exploiting limitations
PDF
Erlang: Agile Scaling
Gwt frameworky GXT + UJORM
Úvod do OOP
Ondra Kučera: Otevřený web a jeho současný stav
Základy GWT
CZNIC: Správa internetu, routing a IPv6
Google App Engine - exploiting limitations
Erlang: Agile Scaling
Ad

Django

  • 1. The Web framework for perfectionists with deadlines.
  • 2. Filosofie ● Loose coupling ● Quick Development ● Don't Repet Yourself (DRY) ● Batteries included :)
  • 3. Součásti ● URL resolver ● ORM ● Forms ● Templates ● Test framework ● Contrib aplikace – auth, admin, sessions, formtools ● Reusable aplikace, Pinax
  • 4. Terminologie ● Model – objekt v DB (User, Article) ● View – kód obstarávající logiku (list_users(), add_article()) ● Template – šablona presentace (user_list.html) ● Projekt – skupina aplikací, definuje DB a spol. (portal, blog), reprezentuje jeden web ● Aplikace – skupina modelů a přidružených objektů, může žít mimo projekt ( comments, galleries,articles)
  • 5. Core Základ systému se stará o: ● Interakci s web serverem – mod_python, FastCGI, WSGI ● Zabalení HTTP požadavku/odpovědi ● Háčky pro uchycení vlastního kódu – signals – události, na které se dá navázat – middleware – umožňuje vsunout kód do různých částí cyklu
  • 6. Views ● Libovolná funkce přijímající HttpRequest a vracející HttpResponse def hello_world( request ): return HttpResponse( "Hello world!" ) def working( request, id ) return HttpResponse( str(get_object_or_404(Author, pk=id)) )
  • 7. URL Resolver (1) ● Překládá URL do volání view ● Mapování pomocí regulárních výrazů – skupiny v reg. výrazech obsahují parametry funkce urlpatterns = patterns('user_app', url(r'^$', 'list', ), url(r'^user/(d+)/$','detail', {'t':'u.html'}), url(r'^groups/',include('user_app.urls')), )
  • 8. URL Resolver (2) ● Parametry v URL umožňují pěkné adresy – /mail/vokurka/inbox/page3/ ● Parametry v urlpatterns pomáhají u obecných funkcí ● include() pomáhá s modularizací ● Lze mapovat i zpětně (view -> URL)
  • 9. ORM (1) ● PostgreSQL, MySQL, SQLite, Oracle ... ● Umožňuje deklarativní definici modelů ● Podporuje dědičnost (čistě) ● Django samo vytvoří DB schéma ● Lazy evaluace dotazů
  • 10. ORM (2) - model class User( models.Model ): name = models.CharField(maxlength=100, unique=True) email = models.EmailField(blank=True) photo = models.ImageField( upload_to='img', blank=True) created = models.DateTimeField( default=datetime.now) group = models.ForeignKey(Group, blank=True, null=True) class Meta: ordering = ['name', '-email'] verbose_name = 'User of our system'
  • 11. ORM (3) - basic >>> user = User( name='vomacka' ) >>> user.save() >>> user.id 1 >>> user.created.year, user.created.month (2007, 2)
  • 12. ORM (4) - queryset >>> qset = User.objects.all() >>> qset = qset.filter( name__contains='vom') >>> qset = qset.filter( group__isnull=False, group__created__gt=now() ) >>> qset = qset.order_by( 'created' ) >>> qset.get( pk=1 ) <User: 1> >>> qset = qset.exclude( name='vokurka' ) >>> qset[:5] [<User: 1>] >>> qset.values('email') [{'email' : 'vomacka@centrum.cz'}]
  • 13. Templates (1) Jednoduchý značkovací jazyk: {% extends "base.html" %} {% block main %} {% if user %} {{ user.name }}, today is {% now "l" %}. {% else %} Stranger, this month is {% now "F" %} {% endif %} {% for obj in object_list %} {{ object|escape|urlize }}<br /> {% endfor%} {% endblock %}
  • 14. Templates (2) ● Založený na dědičnosti (include lze také) ● Využívá proměnné ({{ ... }}) a tagy ({% … %}) – {{ prom.x }} vyzkouší prom.x, prom.x() a prom[x] ● Proměnné lze přeložit pomocí filtrů {{ user.created|date:"F Y" }} ● Soubory se hledají dle konfigurace, například: v adresáři templates/ v projektu a aplikacích v databázi přes HTTP z jiného serveru
  • 15. Forms (1) ● Deklarativní popis formuláře ● Postará se o validaci a „vyčištění“ dat ● Možnost vygenerovat formulář pro Model class MyForm( forms.Form ): email = forms.EmailField( required=False ) choice = forms.ChoiceField( choices=[(1,'one'), (2,'two')] )
  • 16. Forms (2) Template (easy verze) <form action="." method="POST"> <table>{{ form.as_table }}</table> <input type="submit" /> </form> View def my_view( request ): if request.method == 'POST': form = MyForm( request.POST ) else: form = MyForm() if form.is_valid(): form.cleaned_data['email'] return HttpResponseRedirect('/') return render_to_response('template.html', {'form' : form})
  • 17. Další součásti ● Sessions ● Auth ● Generic Views ● Admin ● Syndication ● GeoDjango ● Comments ● ...
  • 18. Generic Views (1) Některé jednoduché věci se dělají stále dokola: ● Přidání/úprava/odstranění objektu ● Výpis seznamu/podrobností ● Archiv Django pro ně nabízí hotové view, kterým stačí nastavit parametry
  • 19. Generic Views (2) urls.py: (r'list/$', 'object_list', {'queryset' : qset, 'paginate_by' : 20} ), (r'(?P<object_id>d+)/$'), 'object_detail', {'queryset' : qset} ), (r'add/$', 'create_object', {'model' : Model, 'template_name' : 'model_form.html'} ), (r'(?P<object_id>d+)/edit/$'), 'update_object', {'model' : Model} ), (r'(?P<object_id>d+)/delete/$'), 'delete_object', {'model' : Model} ),
  • 20. Sessions ● Přídavná aplikace starající se o zprávu session proměnných ● Ve view viditelné jako request.session ● Implementováno několik backendů ( cache, db, ...), do request se dostane přes middleware ● Umožňuje ukládání libovolného obsahu (autoatická serializace)
  • 21. Auth ● Stará se o autentifikaci a autorizaci uživatelů ● Možno použít libovolný backend ● Automaticky vytvoří ADD/UPDATE a DELETE práva k modelům ● Součástí je middleware, který udržuje user v request.user (používá ↑sessions) >>> user.is_authenticated() True >>> user.has_perm('some_perm') True >>> user.password u'sha1$9bb2c$154ecb89654d90a50869c9f115...'
  • 22. Admin (1) ● Používá auth pro správu uživatelů a práv – Uživatel musí mít is_staff – Modely, na které nemá právo ani nevidí ● Umožňuje jednoduché manipulace s objekty CREATE/UPDATE/DELETE ● Poskytuje i základní dokumentaci k projektu
  • 23. Admin (2) class Author( models.Model ): name = … class AuthorOptions(admin.ModelAdmin): list_display = ('name', 'surname', 'created' ) list_filter = ('created', 'site' ) search_fields = ('name','surname','site__title') fields = ( (None, {'fields':(('name','surname'), 'email'}), ) admin.site.register(Author, AuthorOptions)
  • 24. GeoDjango ● Podpora pro práci s geografickými daty ● MySQL, Postgres, SQLite, Oracle… ● Spatial queries ● Map widget
  • 25. Reusable Aplikace ● Znovupoužitelné aplikace pro každý den: – Celery (task queues) – Haystack (fulltext s ruznými backendy) – Taggit (tagging) – Mailer ● Pinax
  • 26. Zdroje ● http://www.djangobook.com/ ● http://code.djangoproject.com/ ● http://docs.djangoproject.com/ ● Mailing listy – django-users, django-cs a django-developers @googlegroups.com ● IRC: #django on freenode.net
  • 27. ?
  • 29. App hosting ● Uživatel vůbec nevidí HW ● Nahraje jen aplikaci a používá služby ● Aplikace v Pythonu nebo Javě (JVM) ● Platí se za spotřebované prostředky: – Bandwidth – CPU time – Storage – API calls
  • 30. Služby ● Static files ● URL Fetch ● Data Store ● Google accounts ● memcached ● Cron jobs ● Mail ● Tasks ● XMPP ● Blobstore ● Images
  • 31. Data store ● NOSQL databáze (GQL) ● Definice modelů, entit, podobně jako v Djangu ● Omezené možnosti dotazů
  • 32. Models from google.appengine.ext import db from google.appengine.api import users class Employee(db.Model): name = db.StringProperty(required=True) role = db.StringProperty(required=True, choices=set(["executive", "manager",])) hire_date = db.DateProperty() account = db.UserProperty() e = Employee( name="", role="manager", account=users.get_current_user()) e.put()
  • 33. GQL from google.appengine.api import users training_registration_list = [ users.User("Alfred.Smith@example.com"), users.User("jharrison@example.com"), users.User("budnelson@example.com")] employees = db.GqlQuery(""" SELECT * FROM Employee WHERE account IN :1 """, training_registration_list) for e in employees: ...
  • 34. Queries q = Person.all() q.filter("last_name =", "Smith") q.filter("height <", 72) q.order("-height") q = db.GqlQuery(""" SELECT * FROM Person WHERE last_name = :1 AND height < :2 ORDER BY height DESC """, "Smith", 72)
  • 35. Django on GAE ● GAE má built-in django 0.96, 1.0 a 1.1 – Čisté django, tedy bez modelu, auth a admin ● djangoappengine (django-nonrel) – Funkční admin ● Django NOSQL GSOC
  • 36. ?
  • 37. Děkuji za pozornost E-mail: honza.kral@gmail.com Twitter: @honzakral