Django

1,757 views

Published on

Published in: Education, Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,757
On SlideShare
0
From Embeds
0
Number of Embeds
237
Actions
Shares
0
Downloads
11
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Django

  1. 1. The Web framework for perfectionists with deadlines.
  2. 2. Filosofie ● Loose coupling ● Quick Development ● Don't Repet Yourself (DRY) ● Batteries included :)
  3. 3. Součásti ● URL resolver ● ORM ● Forms ● Templates ● Test framework ● Contrib aplikace – auth, admin, sessions, formtools ● Reusable aplikace, Pinax
  4. 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. 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. 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. 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. 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. 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. 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. 11. ORM (3) - basic >>> user = User( name='vomacka' ) >>> user.save() >>> user.id 1 >>> user.created.year, user.created.month (2007, 2)
  12. 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. 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. 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. 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. 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. 17. Další součásti ● Sessions ● Auth ● Generic Views ● Admin ● Syndication ● GeoDjango ● Comments ● ...
  18. 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. 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. 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. 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. 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. 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. 24. GeoDjango ● Podpora pro práci s geografickými daty ● MySQL, Postgres, SQLite, Oracle… ● Spatial queries ● Map widget
  25. 25. Reusable Aplikace ● Znovupoužitelné aplikace pro každý den: – Celery (task queues) – Haystack (fulltext s ruznými backendy) – Taggit (tagging) – Mailer ● Pinax
  26. 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. 27. ?
  28. 28. Google App Engine
  29. 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. 30. Služby ● Static files ● URL Fetch ● Data Store ● Google accounts ● memcached ● Cron jobs ● Mail ● Tasks ● XMPP ● Blobstore ● Images
  31. 31. Data store ● NOSQL databáze (GQL) ● Definice modelů, entit, podobně jako v Djangu ● Omezené možnosti dotazů
  32. 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. 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. 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. 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. 36. ?
  37. 37. Děkuji za pozornost E-mail: honza.kral@gmail.com Twitter: @honzakral

×