django
DESCRIPTION
TRANSCRIPT
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)
CoreZá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í HttpResponsedef 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) - modelclass 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' : '[email protected]'}]
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íchv databázipř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 Modelclass 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>
Viewdef 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})
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.passwordu'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 objektyCREATE/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
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● Data Store● memcached ● Mail● XMPP● Images
● URL Fetch● Google accounts● Cron jobs● Tasks● Blobstore
Data store
● NOSQL databáze (GQL)● Definice modelů, entit, podobně jako v
Djangu● Omezené možnosti dotazů
Modelsfrom google.appengine.ext import dbfrom 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("[email protected]"), users.User("[email protected]"), users.User("[email protected]")]
employees = db.GqlQuery("""SELECT *FROM EmployeeWHERE 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