django

37
The Web framework for perfectionists with deadlines.

Upload: tomas-holas

Post on 01-Dec-2014

2.074 views

Category:

Education


4 download

DESCRIPTION

 

TRANSCRIPT

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)

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

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.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

??

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● 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

?

E-mail: [email protected] Twitter: @honzakral

Děkuji za pozornost