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'
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})
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
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
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