Django
Upcoming SlideShare
Loading in...5
×
 

Django

on

  • 1,962 views

 

Statistics

Views

Total Views
1,962
Views on SlideShare
1,730
Embed Views
232

Actions

Likes
2
Downloads
9
Comments
0

7 Embeds 232

http://uc.gug.cz 142
http://www.unicorncollege.cz 43
http://www.slideshare.net 39
http://gdguc.blogspot.cz 3
http://unicorncollege.cz 2
http://old.unicorncollege.cz 2
http://webman.unicornuniverse.eu 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Django Django Presentation 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)
    • 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