SlideShare ist ein Scribd-Unternehmen logo
1 von 37
Downloaden Sie, um offline zu lesen
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

Weitere ähnliche Inhalte

Ähnlich wie Django

ClojureScript
ClojureScriptClojureScript
ClojureScriptjakubkoci
 
MoroSystems na ostravském CZJUGu o Apache Wicket
MoroSystems na ostravském CZJUGu o Apache WicketMoroSystems na ostravském CZJUGu o Apache Wicket
MoroSystems na ostravském CZJUGu o Apache WicketTomáš Páral
 
Czech Sun Training Day 2008 - Java Enterprise System
Czech Sun Training Day 2008 - Java Enterprise SystemCzech Sun Training Day 2008 - Java Enterprise System
Czech Sun Training Day 2008 - Java Enterprise SystemMartin Cerveny
 
Rozšiřitelnost ASP.NET MVC
Rozšiřitelnost ASP.NET MVCRozšiřitelnost ASP.NET MVC
Rozšiřitelnost ASP.NET MVCtopascz
 
React premature performance optimization
React premature performance optimizationReact premature performance optimization
React premature performance optimizationMartinKritof1
 
MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)
MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)
MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)Péhápkaři
 
Technologie užívané při vývoji velkých e-shopů
Technologie užívané při vývoji velkých e-shopůTechnologie užívané při vývoji velkých e-shopů
Technologie užívané při vývoji velkých e-shopůPeckaDesign.cz
 
JavaScript v GTM - Measure Camp Brno 2017
JavaScript v GTM - Measure Camp Brno 2017JavaScript v GTM - Measure Camp Brno 2017
JavaScript v GTM - Measure Camp Brno 2017Michal Blažek
 
Novinky v PostgreSQL 9.4 a JSONB
Novinky v PostgreSQL 9.4 a JSONBNovinky v PostgreSQL 9.4 a JSONB
Novinky v PostgreSQL 9.4 a JSONBTomas Vondra
 
Slovak Sun Training Day 2010 - DTrace
Slovak Sun Training Day 2010 - DTraceSlovak Sun Training Day 2010 - DTrace
Slovak Sun Training Day 2010 - DTraceMartin Cerveny
 
Polymer project presentation
Polymer project presentationPolymer project presentation
Polymer project presentationjskvara
 
Data Restart 2023: Václav Ráš - 10 tipů, jak pracovat s BigQuery
Data Restart 2023: Václav Ráš - 10 tipů, jak pracovat s BigQueryData Restart 2023: Václav Ráš - 10 tipů, jak pracovat s BigQuery
Data Restart 2023: Václav Ráš - 10 tipů, jak pracovat s BigQueryTaste
 
Rozšiřitelnost ASP.NET MVC
Rozšiřitelnost ASP.NET MVCRozšiřitelnost ASP.NET MVC
Rozšiřitelnost ASP.NET MVCtopascz
 
.NET v SQL Serveru
.NET v SQL Serveru.NET v SQL Serveru
.NET v SQL ServeruJan Drozen
 

Ähnlich wie Django (20)

ClojureScript
ClojureScriptClojureScript
ClojureScript
 
MoroSystems na ostravském CZJUGu o Apache Wicket
MoroSystems na ostravském CZJUGu o Apache WicketMoroSystems na ostravském CZJUGu o Apache Wicket
MoroSystems na ostravském CZJUGu o Apache Wicket
 
Czech Sun Training Day 2008 - Java Enterprise System
Czech Sun Training Day 2008 - Java Enterprise SystemCzech Sun Training Day 2008 - Java Enterprise System
Czech Sun Training Day 2008 - Java Enterprise System
 
Rozšiřitelnost ASP.NET MVC
Rozšiřitelnost ASP.NET MVCRozšiřitelnost ASP.NET MVC
Rozšiřitelnost ASP.NET MVC
 
React premature performance optimization
React premature performance optimizationReact premature performance optimization
React premature performance optimization
 
Úvod do rails
Úvod do railsÚvod do rails
Úvod do rails
 
Google App Engine
Google App EngineGoogle App Engine
Google App Engine
 
MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)
MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)
MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)
 
TNPW2-2011-03
TNPW2-2011-03TNPW2-2011-03
TNPW2-2011-03
 
Technologie užívané při vývoji velkých e-shopů
Technologie užívané při vývoji velkých e-shopůTechnologie užívané při vývoji velkých e-shopů
Technologie užívané při vývoji velkých e-shopů
 
Mesour DataGrid
Mesour DataGridMesour DataGrid
Mesour DataGrid
 
TNPW2-2014-03
TNPW2-2014-03TNPW2-2014-03
TNPW2-2014-03
 
JavaScript v GTM - Measure Camp Brno 2017
JavaScript v GTM - Measure Camp Brno 2017JavaScript v GTM - Measure Camp Brno 2017
JavaScript v GTM - Measure Camp Brno 2017
 
TNPW2-2016-03
TNPW2-2016-03TNPW2-2016-03
TNPW2-2016-03
 
Novinky v PostgreSQL 9.4 a JSONB
Novinky v PostgreSQL 9.4 a JSONBNovinky v PostgreSQL 9.4 a JSONB
Novinky v PostgreSQL 9.4 a JSONB
 
Slovak Sun Training Day 2010 - DTrace
Slovak Sun Training Day 2010 - DTraceSlovak Sun Training Day 2010 - DTrace
Slovak Sun Training Day 2010 - DTrace
 
Polymer project presentation
Polymer project presentationPolymer project presentation
Polymer project presentation
 
Data Restart 2023: Václav Ráš - 10 tipů, jak pracovat s BigQuery
Data Restart 2023: Václav Ráš - 10 tipů, jak pracovat s BigQueryData Restart 2023: Václav Ráš - 10 tipů, jak pracovat s BigQuery
Data Restart 2023: Václav Ráš - 10 tipů, jak pracovat s BigQuery
 
Rozšiřitelnost ASP.NET MVC
Rozšiřitelnost ASP.NET MVCRozšiřitelnost ASP.NET MVC
Rozšiřitelnost ASP.NET MVC
 
.NET v SQL Serveru
.NET v SQL Serveru.NET v SQL Serveru
.NET v SQL Serveru
 

Mehr von Tomáš Holas

Gwt frameworky GXT + UJORM
Gwt frameworky GXT + UJORMGwt frameworky GXT + UJORM
Gwt frameworky GXT + UJORMTomáš Holas
 
Ondra Kučera: Otevřený web a jeho současný stav
Ondra Kučera: Otevřený web a jeho současný stavOndra Kučera: Otevřený web a jeho současný stav
Ondra Kučera: Otevřený web a jeho současný stavTomáš Holas
 
CZNIC: Správa internetu, routing a IPv6
CZNIC: Správa internetu, routing a IPv6CZNIC: Správa internetu, routing a IPv6
CZNIC: Správa internetu, routing a IPv6Tomáš Holas
 
Google App Engine - exploiting limitations
Google App Engine - exploiting limitationsGoogle App Engine - exploiting limitations
Google App Engine - exploiting limitationsTomáš Holas
 
Erlang: Agile Scaling
Erlang: Agile ScalingErlang: Agile Scaling
Erlang: Agile ScalingTomáš Holas
 

Mehr von Tomáš Holas (7)

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

Kürzlich hochgeladen

SEO Restart 2024: Martin Michálek - Nová metrika rychlosti INP a praktické ti...
SEO Restart 2024: Martin Michálek - Nová metrika rychlosti INP a praktické ti...SEO Restart 2024: Martin Michálek - Nová metrika rychlosti INP a praktické ti...
SEO Restart 2024: Martin Michálek - Nová metrika rychlosti INP a praktické ti...Taste
 
SEO Restart 2024: Richard Klačko - Klíčovka s AI pohonem
SEO Restart 2024: Richard Klačko - Klíčovka s AI pohonemSEO Restart 2024: Richard Klačko - Klíčovka s AI pohonem
SEO Restart 2024: Richard Klačko - Klíčovka s AI pohonemTaste
 
SEO Restart 2024: Roman Teuschel - Mezinárodní SEO v kontextu expanze
SEO Restart 2024: Roman Teuschel - Mezinárodní SEO v kontextu expanzeSEO Restart 2024: Roman Teuschel - Mezinárodní SEO v kontextu expanze
SEO Restart 2024: Roman Teuschel - Mezinárodní SEO v kontextu expanzeTaste
 
SEO Restart 2024: Martin Žatkovič - Můžeme jakožto SEO konzultanti uspět v Go...
SEO Restart 2024: Martin Žatkovič - Můžeme jakožto SEO konzultanti uspět v Go...SEO Restart 2024: Martin Žatkovič - Můžeme jakožto SEO konzultanti uspět v Go...
SEO Restart 2024: Martin Žatkovič - Můžeme jakožto SEO konzultanti uspět v Go...Taste
 
SEO Restart 2024: Martin Kopta a Jakub Goldmann - Jak se dnes navrhují weby a...
SEO Restart 2024: Martin Kopta a Jakub Goldmann - Jak se dnes navrhují weby a...SEO Restart 2024: Martin Kopta a Jakub Goldmann - Jak se dnes navrhují weby a...
SEO Restart 2024: Martin Kopta a Jakub Goldmann - Jak se dnes navrhují weby a...Taste
 
SEO Restart 2024: Sarah Presch - Kognitivní předsudky - jak psychologické teo...
SEO Restart 2024: Sarah Presch - Kognitivní předsudky - jak psychologické teo...SEO Restart 2024: Sarah Presch - Kognitivní předsudky - jak psychologické teo...
SEO Restart 2024: Sarah Presch - Kognitivní předsudky - jak psychologické teo...Taste
 
SEO Restart 2024: Jan Tichý - Na počátku bylo...
SEO Restart 2024: Jan Tichý - Na počátku bylo...SEO Restart 2024: Jan Tichý - Na počátku bylo...
SEO Restart 2024: Jan Tichý - Na počátku bylo...Taste
 
SEO Restart 2024: Tomáš Zahálka - Tajné SEO tipy pro Shoptet
SEO Restart 2024: Tomáš Zahálka - Tajné SEO tipy pro ShoptetSEO Restart 2024: Tomáš Zahálka - Tajné SEO tipy pro Shoptet
SEO Restart 2024: Tomáš Zahálka - Tajné SEO tipy pro ShoptetTaste
 
SEO Restart 2024: Vojtěch Fiala - Linkbuilding vs. (digitální) PR: Od odkazů ...
SEO Restart 2024: Vojtěch Fiala - Linkbuilding vs. (digitální) PR: Od odkazů ...SEO Restart 2024: Vojtěch Fiala - Linkbuilding vs. (digitální) PR: Od odkazů ...
SEO Restart 2024: Vojtěch Fiala - Linkbuilding vs. (digitální) PR: Od odkazů ...Taste
 
SEO Restart 2024: Martina Zrzavá Libřická - SEO & DEV: Jak na vývojáře od poc...
SEO Restart 2024: Martina Zrzavá Libřická - SEO & DEV: Jak na vývojáře od poc...SEO Restart 2024: Martina Zrzavá Libřická - SEO & DEV: Jak na vývojáře od poc...
SEO Restart 2024: Martina Zrzavá Libřická - SEO & DEV: Jak na vývojáře od poc...Taste
 

Kürzlich hochgeladen (10)

SEO Restart 2024: Martin Michálek - Nová metrika rychlosti INP a praktické ti...
SEO Restart 2024: Martin Michálek - Nová metrika rychlosti INP a praktické ti...SEO Restart 2024: Martin Michálek - Nová metrika rychlosti INP a praktické ti...
SEO Restart 2024: Martin Michálek - Nová metrika rychlosti INP a praktické ti...
 
SEO Restart 2024: Richard Klačko - Klíčovka s AI pohonem
SEO Restart 2024: Richard Klačko - Klíčovka s AI pohonemSEO Restart 2024: Richard Klačko - Klíčovka s AI pohonem
SEO Restart 2024: Richard Klačko - Klíčovka s AI pohonem
 
SEO Restart 2024: Roman Teuschel - Mezinárodní SEO v kontextu expanze
SEO Restart 2024: Roman Teuschel - Mezinárodní SEO v kontextu expanzeSEO Restart 2024: Roman Teuschel - Mezinárodní SEO v kontextu expanze
SEO Restart 2024: Roman Teuschel - Mezinárodní SEO v kontextu expanze
 
SEO Restart 2024: Martin Žatkovič - Můžeme jakožto SEO konzultanti uspět v Go...
SEO Restart 2024: Martin Žatkovič - Můžeme jakožto SEO konzultanti uspět v Go...SEO Restart 2024: Martin Žatkovič - Můžeme jakožto SEO konzultanti uspět v Go...
SEO Restart 2024: Martin Žatkovič - Můžeme jakožto SEO konzultanti uspět v Go...
 
SEO Restart 2024: Martin Kopta a Jakub Goldmann - Jak se dnes navrhují weby a...
SEO Restart 2024: Martin Kopta a Jakub Goldmann - Jak se dnes navrhují weby a...SEO Restart 2024: Martin Kopta a Jakub Goldmann - Jak se dnes navrhují weby a...
SEO Restart 2024: Martin Kopta a Jakub Goldmann - Jak se dnes navrhují weby a...
 
SEO Restart 2024: Sarah Presch - Kognitivní předsudky - jak psychologické teo...
SEO Restart 2024: Sarah Presch - Kognitivní předsudky - jak psychologické teo...SEO Restart 2024: Sarah Presch - Kognitivní předsudky - jak psychologické teo...
SEO Restart 2024: Sarah Presch - Kognitivní předsudky - jak psychologické teo...
 
SEO Restart 2024: Jan Tichý - Na počátku bylo...
SEO Restart 2024: Jan Tichý - Na počátku bylo...SEO Restart 2024: Jan Tichý - Na počátku bylo...
SEO Restart 2024: Jan Tichý - Na počátku bylo...
 
SEO Restart 2024: Tomáš Zahálka - Tajné SEO tipy pro Shoptet
SEO Restart 2024: Tomáš Zahálka - Tajné SEO tipy pro ShoptetSEO Restart 2024: Tomáš Zahálka - Tajné SEO tipy pro Shoptet
SEO Restart 2024: Tomáš Zahálka - Tajné SEO tipy pro Shoptet
 
SEO Restart 2024: Vojtěch Fiala - Linkbuilding vs. (digitální) PR: Od odkazů ...
SEO Restart 2024: Vojtěch Fiala - Linkbuilding vs. (digitální) PR: Od odkazů ...SEO Restart 2024: Vojtěch Fiala - Linkbuilding vs. (digitální) PR: Od odkazů ...
SEO Restart 2024: Vojtěch Fiala - Linkbuilding vs. (digitální) PR: Od odkazů ...
 
SEO Restart 2024: Martina Zrzavá Libřická - SEO & DEV: Jak na vývojáře od poc...
SEO Restart 2024: Martina Zrzavá Libřická - SEO & DEV: Jak na vývojáře od poc...SEO Restart 2024: Martina Zrzavá Libřická - SEO & DEV: Jak na vývojáře od poc...
SEO Restart 2024: Martina Zrzavá Libřická - SEO & DEV: Jak na vývojáře od poc...
 

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