Apresentando   Marcel P. Caraciolo   @marcelcaraciolo  Residência RISE - 2011                           1
Esta palestra está sobre a licença Creative Commonsou seja distribuir , modificar e copiar tudo liberado :Dmas sempre cite ...
O que é Django ?            Residência de Reuso - 2011.1 - Recife/PE                                                       3
Não é Jungle. É Django.O que é Django ?                             4
Não é Django Reinhardt ... na verdade é                                          5
É um framework web Criado em 2005             Aplicação Web  Lawrence, Kansas -Lawerence Journal World  Licença BSD       ...
É um framework web Criado em 2005         DRY      Aplicação Web  Lawrence, Kansas - Repeat Yourself             Don’tLawe...
Django é Python!       !"#$%&()*"*! *+"(,%-./0. Escrito em Python      !"#$$$%&(&)*+,    Focado emDesenvolvimento Ágil    ...
Projeto == Várias aplicaçõesdjango.contrib.admin     django-registration       south           django.contrib.comments   d...
E isto é MVC ?  ModelsControllers   Views                      Residência de Reuso - 2011.1 - Recife/PE                   ...
Alguns chamam de MTV                Residência de Reuso - 2011.1 - Recife/PE                                              ...
Alguns chamam de MTV  Model - Template - Views                             12
AplicaçõesDeve fazer uma coisa, e fazer direitoSe a descrição de sua aplicação for maior que umalinha, talvez ela precise ...
AplicaçõesInstalando a aplicação Coloque no path (PYTHONPATH) Coloque no INSTALLED_APPS no settings.py                    ...
AplicaçõesA aplicação é auto-contidatests.pyurls.pytemplates/admin.py                             Residência de Reuso - 20...
Fácil de Usar$ pip install django$ django-admin.py startproject dwitter                               Residência de Reuso ...
Fácil de Usar!"#$"%&#()"*%+"*,#-)*                                          6#%7%8-9#"*(%:;< $ pip install django $ django...
Fácil de Usar  $ cd dwitter!""#$%#"&$()*"+&,"+-(%*+  $ python manage.py runserver                                         ...
Fácil de Usar                Residência de Reuso - 2011.1 - Recife/PE                                                     ...
!"#$%&#()*+)&,-.Quem usa ?        !"#$$$   Residência de Reuso - 2011.1 - Recife/PE                                       ...
Documentação               21
Banco de Dados           !"#$%                   22
Banco!"#$%&()*+            de Dadosdef book_list(request):    try:        db = MySQLdb.connect(user=me, db=mydb,          ...
Banco de Dados     12 linhas em Python ... :(                                  24
Banco de Dados       12 linhas em Python ... :(   !"#$%!&()*+"(,-./0-,$1-223045                                    25
ORM Padrão Active Record            !"#$%&()*+            Classe                           Tabledef book_list(request):   ...
Criar tabelas?! Fácil!     $ python manage.py syncdb  Crie as tabelas no banco. E pronto!                             Resi...
Vamos começar ?djangoproject.com - site oficialdjangobrasil.org - site oficial nacionaldjangogigs.com - vagas de empregrodja...
Vamos à prática!             Residência de Reuso - 2011.1 - Recife/PE                                                     ...
!"#$%&()(*+,%#-./0%Instalação Python   $ sudo apt-get install python   $ sudo apt-get install python     sudo apt-get inst...
2)3$45(6-/1)            2)!"*&#5,(,1)   Instalação de Banco de Dados  2)7"/+%-89:            2)8<=(/-)89:)>#<?@--  2);<89:...
Instalação de Banco de Dados Vamos usar o Sqlite! Precisa instalar ?! Não :D Python já vem com SGBD incluso! http://docs.p...
Instalação de Django                 3 maneiras!          apt-get install python-django   http://www.djangoproject.com/dow...
!""#$%&()            !""#$%&()             !""#$%&()    Instalação de Django >>> import django>>> import django >>> import...
!"#$"%&#()"*%+"*,#-)* Criando um projeto                                      5#%6%7-8#"*(%9:;   $ django-admin.py startpr...
Criando um projeto         !"#$%!&(   Residência de Reuso - 2011.1 - Recife/PE                                            ...
!""#$%#"&$()*"+&,"+-(%*+ Criando um projeto                                                              .(&/&0%1("+)&234 ...
!"#$%&$()&*+ Entendendo sua App!!"#$!%&%!+,%-   "()*%&%.%/0-)1%   #!+),!$*"!,%&%234-"5%6                                  ...
!"#$%&%($)*$      urls.py! "#$%&()*$+,-$./&$+&,-+$&*.*$/0(),+$1($(2,)+1+$/+)+$#+3$ /(4&5*2(3$6778Módulo urls.py serve como...
!"#$%&%($)*$      views.py! "#$%&()*$+,$-),./012$3,()4,$(565$1#376,835/$&$549,85$ Módulo views.py tem funções com parâmetr...
!"#$%&%($)*$      Exemplo!"#$%&%($)*$     +,-./01%2!""http://mysite.com/time        +,-./01%2!""http://mysite.com/time   h...
!"#$%&%($)*$     Exemplo 2    +,-./01%2!""http://mysite.com/time/plus/2    +,-./01%2!""http://mysite.com/time/plus/2    ht...
Html dentro da views?                    Residência de Reuso - 2011.1 - Recife/PE                                         ...
!"#$%&"(         Templates! "#$%&%()%()*+,-%(.#($)"("*&+,-*(%(/%(-%$%(,.#$#.,#0#1          Separa a camada de apresentação...
!"#$%&"(     Templates  ! "#$%&&($#($)*$+,*$)#$*%-#.*/$0#1,2&.#34$5$6*(.#7.348Baseia-se em 2 objetos:       ! 9($*%-#.*$!"...
!"#$%&"(    Exemplo 1! :(  )*+#"*&"#$%&()#*(+,"#-"&./012&3"!"#$%&",-,./0"1       from django.http import HttpResponse     ...
!"#$%&"(    Exemplo 2! )"*+,-&"#$%&()#*(+,"#-"&./012&3".$",/0123"&-/0124%.("/0 :|     from django.http import HttpResponse...
!"#$%&"(    Exemplo 3!:)!")*")&"#$%&()#*(+,"#-"&./012&3"+","#$%&"-.                         TEMPLATE_DIRS = (    405,647$8...
!"#$%&"(    Exemplo 3! !")*")&"#$%&()#*(+,"#-"&./012&3"+","#$%&"-.:D                         TEMPLATE_DIRS = (    405,647$...
!"#$%&"(    Exemplo 4 :O! "#$%&()*+,*-.*/(0))"*+"),-,)"($-*("./ from django.shortcuts import render_to_response from datet...
!"#$%&"()*!+$            !"#$%&"()*!+$          !"#$%&"()*!+$     Lembrete!            !"#$%&"()*!+$                      ...
Templates: {{}}                               !"#$%&"()*++,,Sintaxe simples de templates                               <ht...
Templates: {{}}             Tags                    Residência de Reuso - 2011.1 - Recife/PE                              ...
!"#$%&"()*&+(*,-*-.  Tags/0##"1   {% comment %} Bu! {% endcomment %}    203   {% for elemento in lista %}              <li...
!"#$%&"()*+,%"-(Filters        <html>            <head>Ejemplo templates</head> .%"       <body>                Hola, {{ u...
Filters             !"#$%&"()*+,%"-(                           {value: 123456789}          &..         {{ value|add:”1” }}...
Modelos    Nós temos objetos e queremos persistí-los   Mapeamento entre Objetos e tabelas  Django tem ORM!                ...
!"#$%"    Eu crio classes e objetos from django.db import models class Books(models.Model):     name = models.CharField(bl...
!"#$%&(&)$*+,O ORM converte para SQL       BEGIN;       CREATE TABLE "website_books" (           "id" integer NOT NULL PRI...
Com 1 comando!    $ python manage.py syncdb                         Residência de Reuso - 2011.1 - Recife/PE              ...
Configure o seu banco!"#$%&()*+,#%*-./     DATABASE_ENGINE = sqlite3     DATABASE_NAME = db.sqlite     DATABASE_USER =     ...
e se alterar os modelos ?              Não atualiza os esquemas existentes! :(           GoHorse: Dropa na mão e rexecuta ...
Exemplo                     !"#$%&$ python   manage.py syncdbCreating   table auth_permissionCreating   table auth_groupCr...
Exercício 03    Criar o backend da sua app seminarios            Vamos usar o sqlite3                                     ...
Exemplo   Hora de fazer montar consultas!                            Residência de Reuso - 2011.1 - Recife/PE             ...
ORM- Consultas !"#$%&()*+,#,(-#*(./0 $ python manage.py shell             select * from publisher;    ts = Publisher.objec...
!"#$%&())*+%,&-#))./ORM- Consultas     >>> Publisher.objects.all()     [<Publisher: Publisher object>]     class Publisher...
ORM- Inserção                !"#$%&             o = Model(...)    o.save()!"   >>> p = Publisher(     ...       name=Apres...
!"#$%&                 !"#$%&    ORM- Atualização    o.save()                        o.save()     >>>   ...     >>>   p.id...
!"#"$"                    o.delete()ORM- Deleção    >>>   ...       o.delete()    >>>   p.id!   52    >>>   ...    >>>   p...
!"#"$%&(&)&*(+,-./0!"#"$%&(&)&*(+,-./0 Select 1 resultado                             .get(...)                           ...
!"#"$%&(&)&*(+,-./0+ Select n resultados!"#"$%&(&)&*(+,-./0+!"#"$%&(&)&*(+,-./0+ .all()                     .all()    >>> ...
!"#$%&()#"*$%+",-)./"$%    Manipulação de consultas   !"#$%&()#"*$%+",-)./"$%     Modelo.objects.filter(campo1="valor1", c...
Order!"#$"%&         By             !"#$"%&                 .order_by(...)                 .order_by(...)     >>> Publishe...
!"#$%"&()*"+%,     !"#$%"&()*"+%,     !"#$%"&()*"+%,    !"#$%"&()*"+%, Relacionamentos One-to-One         OneToOneField   ...
!"#$%"&()*"+%,      !"#$%"&()*"+%,     !"#$%"&()*"+%, Relacionamentos One-to-Many     !"#$%"&()*"+%,          ForeignKeyFi...
!"#$%"&()*"+%,       !"#$%"&()*"+%,      !"#$%"&()*"+%,  Relacionamentos Many-to-Many          ManyToManyField          Ma...
!"#$%"&()*"+%,         !"#$%"&()*"+%,          !"#$%"&()*"+%,       Ponteiros inversos    !"#$%&(#)**(#+%&),%(#-"./0)-$-#)...
Laziness                   !"#$%&                   !"#$%&#$%&($)*+#$%()*%$,%,-,&)+#./(%&)#(0%.,#*1,(+,%$,%               ...
Exercício 04!"#$%&!()*(+&"(*,(-(+&#./)*(&0&$(1(*(                             Residência de Reuso - 2011.1 - Recife/PE    ...
Interface Administrativa                     Residência de Reuso - 2011.1 - Recife/PE                                     ...
Interface Administrativa                     Residência de Reuso - 2011.1 - Recife/PE                                     ...
djang.contrib.admin            Instalação 1/3                             Residência de Reuso - 2011.1 - Recife/PE        ...
djang.contrib.admin!"#$%&#()*$+,$-.#/#0*1$                Instalação 2/3               !"#$%!&(    INSTALLED_APPS = (     ...
!"#$%&(%)*+,&%,-.djang.contrib.admin !"#$%&(%)*+,&%,-.                  Instalação 3/3   $ python manage.py syncdb   $ pyt...
!"#$%&(  Opa! Falta registrar os modelos! "#$#%!%$&&%$&%(&)&*%&+%,-./0! 1&2)&%3-4%5/$&+/,%,&*6)%78,8+&,%$&,$&%&+%#$58)%.% ...
Exercício 04          !"#$%&#(")   Residência de Reuso - 2011.1 - Recife/PE                                               ...
!"#$%$&()*"+,-#.#$  !"#$%$&()*"+,-#.#$  Forms3 componentesWidgetWidget          !"#$"%&%&()$+#"(&)*+,-.&%&(-(/012         ...
Criação de Formulário        Passo 1: Definição de um formulário forms.pyhttp://docs.djangoproject.com/en/dev/ref/forms/fiel...
Criação de Formulário   Passo 2: Definição do template do Formulário                                                  conta...
Criação de Formulário    Passo 3: Definição da view do Formulário                                    Residência de Reuso - ...
!"#$%"&$()*+,*$"Criação de Formulário !"#$%"&()"*)+%+),+-.#+/.01$23)++&"/.+#++/+#+4.$-#           Forms tem validação próp...
Forms a partir de Models !"#$%&&(#)#&*+&,"*+-%    Aqui é DRY meu caro!!            from django.db import models           ...
Exercício 04       Alguns truques agora...                            Residência de Reuso - 2011.1 - Recife/PE            ...
Django Avançado  1. Middleware  2. Caching  3. Deploying  4. Apps Recomendadas                         Residência de Reuso...
Django Avançado 1. Middleware  2. Caching  3. Deploying  4. Apps Recomendadas                         Residência de Reuso ...
!"##$%&(%  MiddlewarePermite incrementar a funcionalidade injetando fluxo de    !"#$%&()*&$&#+),)$-./+)"/01)202$&.31)40,1&$...
Middleware      !"##$%&(%class MyMiddleware(object):    def process_request(self, request):        """Se ejecuta antes de ...
!"##$%&(%    Middleware!"#"$%&()"*#+,)*-#)"&.-%$*//,"01-""#",,)21-()"#%&+%#3"#214)%*"%*#+,%*,-.%*),%$,+(#%*,#%,    %/%-.-"...
Django Avançado  1. Middleware  2. Caching  3. Deploying  4. Apps Recomendadas                         Residência de Reuso...
Caching                             !"!#$%&  Sempre importante estar aliviando o banco de consultas...    $()*            ...
Django Avançado 1. Middleware 2. Caching 3. Deploying 4. Apps Recomendadas                        Residência de Reuso - 20...
Deploying     Por o sistema em produção  VirtualEnv + PIP + Fabric                           Residência de Reuso - 2011.1 ...
!"#$%&()*  ! "#$%&%#$%#()*+,&-%.)*$%*-)/*-(01%12)/*$%-*/(.%,)3     Virtualenv  ! 4)$)*&1+5%.+*6%#%*/7*87%9+*$%*-(01%12)/*%...
Pip                             !"!                             !"!  ! "#$%&()#(*+,-#%#$()#.($/0.&(12(34        Gerenciado...
!"#$%&      Fabric                !"#$%&““Repetition leads to boredom, boredom to horrifying mistakes,      “Repetition le...
Django Avançado 1. Middleware 2. Caching 3. Deploying 4. Apps Recomendadas                        Residência de Reuso - 20...
%6*896(,%;6*8968.1<+,=>%%?/,02(,/%%?/,02(,/%*.3#:,(,% django-registration%?/,02(,/%*:.2,4%%?:.01%%?:.0.)(%%?#622@./4%*!610...
django-socialregistration; <-2=&)80,>2?192,770; @)(92:,0,>2?,-2$         O django-registration só que anabolizado!  ; (A"9...
django-piston: ;</59,7./+;#5/5;*/,5/;=>?2;@ABCD)E: ;F)G;DH*E;32(5E5*I3         !"#$%&()*+&$    Framework Django para const...
Apenas uma ponta do iceberg                      Residência de Reuso - 2011.1 - Recife/PE                                 ...
Lembre-se da comunidade!         http://python.org.br       http://djangobrasil.org     http://pug-pe.python.org.br       ...
Trabalho da Semana Trabalho para 5 pessoas Criar um sistema em Django com o assunto visto até aqui O sistema deve ter no m...
Referências e Créditos Desenvolvimento web com Python e Django       http://www.slideshare.net/igorsobreira/desenvolviment...
BibliografiaThe Definitive Guide to Django: Web Development Done Right. AdrianHolovaty, Jacob K. Ed. Appress ISBN-13: 978-1...
Apresentando  Marcel P. Caraciolo  caraciol@gmail.com  Residência RISE - 2011                           116
Exercício 01Vamos construir um mini-sistema de submissão      de palestras do nosso seminário       1. Criar um projeto se...
Exercício 05 Vamos criar a nossa interface administrativa para o nossos                 modelos recém-criados             ...
Exercício 04  Vamos criar os modelos para Trabalho e Palestrante           Trabalhousuario: Usertitulo: String            ...
Exercício 02  Vamos criar 2 novos templates        1.trabalhos.html       2. detalhes.html                            Resi...
Exercício 06Vamos construir um formulário simples de submissão de palestras!                                              ...
Upcoming SlideShare
Loading in...5
×

Introdução ao Django

9,492

Published on

Curso de Django para a Residência De Reuso pela startup RISE 21/05/2011

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

No Downloads
Views
Total Views
9,492
On Slideshare
0
From Embeds
0
Number of Embeds
14
Actions
Shares
0
Downloads
168
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Introdução ao Django

  1. 1. Apresentando Marcel P. Caraciolo @marcelcaraciolo Residência RISE - 2011 1
  2. 2. Esta palestra está sobre a licença Creative Commonsou seja distribuir , modificar e copiar tudo liberado :Dmas sempre cite a original nos seus créditos http://creativecommons.org/licenses/by-sa/3.0/ Esta aula faz parte do curso de Residência de Reuso de Software pela RISE Residência de Reuso - 2011.1 - Recife/PE 2
  3. 3. O que é Django ? Residência de Reuso - 2011.1 - Recife/PE 3
  4. 4. Não é Jungle. É Django.O que é Django ? 4
  5. 5. Não é Django Reinhardt ... na verdade é 5
  6. 6. É um framework web Criado em 2005 Aplicação Web Lawrence, Kansas -Lawerence Journal World Licença BSD Residência de Reuso - 2011.1 - Recife/PE 6
  7. 7. É um framework web Criado em 2005 DRY Aplicação Web Lawrence, Kansas - Repeat Yourself Don’tLawerence Journal World Licença BSD http://www.flickr.com/photos/plinton/215437652/ 7
  8. 8. Django é Python! !"#$%&()*"*! *+"(,%-./0. Escrito em Python !"#$$$%&(&)*+, Focado emDesenvolvimento Ágil Don’t Repeat yourself Residência de Reuso - 2011.1 - Recife/PE 8
  9. 9. Projeto == Várias aplicaçõesdjango.contrib.admin django-registration south django.contrib.comments django-mailer django-pagination ... http://djangopackages.com Residência de Reuso - 2011.1 - Recife/PE 9
  10. 10. E isto é MVC ? ModelsControllers Views Residência de Reuso - 2011.1 - Recife/PE 10
  11. 11. Alguns chamam de MTV Residência de Reuso - 2011.1 - Recife/PE 11
  12. 12. Alguns chamam de MTV Model - Template - Views 12
  13. 13. AplicaçõesDeve fazer uma coisa, e fazer direitoSe a descrição de sua aplicação for maior que umalinha, talvez ela precise ser quebradaReutilizável (DRY se lembra ?)Talvez já exista! Residência de Reuso - 2011.1 - Recife/PE 13
  14. 14. AplicaçõesInstalando a aplicação Coloque no path (PYTHONPATH) Coloque no INSTALLED_APPS no settings.py settings.py Residência de Reuso - 2011.1 - Recife/PE 14
  15. 15. AplicaçõesA aplicação é auto-contidatests.pyurls.pytemplates/admin.py Residência de Reuso - 2011.1 - Recife/PE 15
  16. 16. Fácil de Usar$ pip install django$ django-admin.py startproject dwitter Residência de Reuso - 2011.1 - Recife/PE 16
  17. 17. Fácil de Usar!"#$"%&#()"*%+"*,#-)* 6#%7%8-9#"*(%:;< $ pip install django $ django-admin.py startproject dwitter $ django-admin.py startproject dwitter __init__.py manage.py settings.py urls.py !"#$%&"(%")*"+,-(.&///"0"%%./%*(%0#%1/%2#3#444 de Reuso - 2011.1 - Recife/PE Residência !".51"23%+*(4%"2(")*"+,-(.&"5!"#$%&#(6"(*"278*9/ 17
  18. 18. Fácil de Usar $ cd dwitter!""#$%#"&$()*"+&,"+-(%*+ $ python manage.py runserver .(&/&0%1("+)&234 $ cd dwitter $ python manage.py runserver Validating models... 0 errors found Django version 1.1, using settings dwitter.settings Development server is running at http:// 127.0.0.1:8000/ Quit the server with CONTROL-C. Já vem com um servidor web ! Residência de Reuso - 2011.1 - Recife/PE 18
  19. 19. Fácil de Usar Residência de Reuso - 2011.1 - Recife/PE 19
  20. 20. !"#$%&#()*+)&,-.Quem usa ? !"#$$$ Residência de Reuso - 2011.1 - Recife/PE 20
  21. 21. Documentação 21
  22. 22. Banco de Dados !"#$% 22
  23. 23. Banco!"#$%&()*+ de Dadosdef book_list(request): try: db = MySQLdb.connect(user=me, db=mydb, passwd=secret, host=localhost) cursor = db.cursor() cursor.execute(SELECT nama FROM books ORDER BY name) names = [] for row in cursor.fetchall() names.append(row[0]) db.close() except: return render_to_response(500.html) return render_to_response(book_list.html, {names:names}) Residência de Reuso - 2011.1 - Recife/PE 23
  24. 24. Banco de Dados 12 linhas em Python ... :( 24
  25. 25. Banco de Dados 12 linhas em Python ... :( !"#$%!&()*+"(,-./0-,$1-223045 25
  26. 26. ORM Padrão Active Record !"#$%&()*+ Classe Tabledef book_list(request): names = Books.objects.all().order_by(name) return render_to_response(book_list.html, {names:names}) Residência de Reuso - 2011.1 - Recife/PE 26
  27. 27. Criar tabelas?! Fácil! $ python manage.py syncdb Crie as tabelas no banco. E pronto! Residência de Reuso - 2011.1 - Recife/PE 27
  28. 28. Vamos começar ?djangoproject.com - site oficialdjangobrasil.org - site oficial nacionaldjangogigs.com - vagas de empregrodjangopeople.net - rede socialdjangosites.org - rede social de sites em djangodjangosearch.com - busca assuntos relacionadosdjangocodesearch.com - busca nos fontes Residência de Reuso - 2011.1 - Recife/PE 28
  29. 29. Vamos à prática! Residência de Reuso - 2011.1 - Recife/PE 29
  30. 30. !"#$%&()(*+,%#-./0%Instalação Python $ sudo apt-get install python $ sudo apt-get install python sudo apt-get install python http://www.python.org/download http://www.python.org/download/ http://www.python.org/download/ Já vem com python instalado !"#$%&#()*+%,"-./0%.)1%2*1,#"1%2.5.4%0%2.6.1 !"#$%&#()*+%,"-./0%.)1%2*1,#"1%2.5.4%0%2.6.1 Residência de Reuso - 2011.1 - Recife/PE 30
  31. 31. 2)3$45(6-/1) 2)!"*&#5,(,1) Instalação de Banco de Dados 2)7"/+%-89: 2)8<=(/-)89:)>#<?@-- 2);<89: 2)A.;)0.B 2);54"/"C)89:)8-D-)BEEF 2)3(46- Poderíamos escolher dentre vários SGBD’s 2)G5-=5, 2)!"#$%& 2)30.! Residência de Reuso - 2011.1 - Recife/PE 31
  32. 32. Instalação de Banco de Dados Vamos usar o Sqlite! Precisa instalar ?! Não :D Python já vem com SGBD incluso! http://docs.python.org/library/sqlite3.html Residência de Reuso - 2011.1 - Recife/PE 32
  33. 33. Instalação de Django 3 maneiras! apt-get install python-django http://www.djangoproject.com/download python setup.py installhttp://www.djangoproject.com/svn/django/trunk Residência de Reuso - 2011.1 - Recife/PE 33
  34. 34. !""#$%&() !""#$%&() !""#$%&() Instalação de Django >>> import django>>> import django >>> import django >>> django.VERSION>>> django.VERSION >>> django.VERSION>>> import final, 0) (1, 1, 0, django>>> django.VERSION 0) (1, 1, 0, final,(1, 1, 0, final, 0)(1, 1, 0, final, 0) >>> import django>>> import(most recent call last): >>> import django Traceback django>>> import (most recent 1, inlast): Traceback django callTraceback (most recent call last): File "<stdin>", line <module> File "<stdin>", line 1, in last): "<stdin>", line call <module> 1, in <module>Traceback (most recent named django File ImportError: No module ImportError: No module 1, in <module> File "<stdin>", line named djangoImportError: No module named djangoImportError: No module named django Residência de Reuso - 2011.1 - Recife/PE 34
  35. 35. !"#$"%&#()"*%+"*,#-)* Criando um projeto 5#%6%7-8#"*(%9:; $ django-admin.py startproject seminario $ django-admin.py startproject dwitter __init__.py manage.py settings.py urls.py !"#$%&"(%")*"+,-(.&///"0"%%./%*(%0#%1/%2#3#444 Residência de Reuso - 2011.1 - Recife/PE 35
  36. 36. Criando um projeto !"#$%!&( Residência de Reuso - 2011.1 - Recife/PE 36
  37. 37. !""#$%#"&$()*"+&,"+-(%*+ Criando um projeto .(&/&0%1("+)&234 $ cd dwitter $ python manage.py runserver Validating models... 0 errors found Django version 1.1, using settings dwitter.settings Development server is running at http:// 127.0.0.1:8000/ Quit the server with CONTROL-C. Residência de Reuso - 2011.1 - Recife/PE 37
  38. 38. !"#$%&$()&*+ Entendendo sua App!!"#$!%&%!+,%- "()*%&%.%/0-)1% #!+),!$*"!,%&%234-"5%6 Residência de Reuso - 2011.1 - Recife/PE 38
  39. 39. !"#$%&%($)*$ urls.py! "#$%&()*$+,-$./&$+&,-+$&*.*$/0(),+$1($(2,)+1+$/+)+$#+3$ /(4&5*2(3$6778Módulo urls.py serve como porta de entrada para requisições HTTP! As URL’s são definidas por expressões regulares que redirecionam as 9($1(%2(2$:;<3$(#(=+2,(3$.(15+2,($(>/)(35*2(3$)(=0#+)(3$ requisições para as respectivas views ?0($)(15)5=(2$+$@02&5*2(3$1($0(12$./& E/FGG.B35,(A&*.G+H*0,G 0)#3A/B I0)#/+E()23J ,.# C5(D3A/B ... Residência de Reuso - 2011.1 - Recife/PE 39
  40. 40. !"#$%&%($)*$ views.py! "#$%&()*$+,$-),./012$3,()4,$(565$1#376,835/$&$549,85$ Módulo views.py tem funções com parâmetros um objeto HttpRequest +,-"./0.$)$2$85+5/$:5/$1#376,835/$+,$:#$;<"$(#18&3#+5/=$ Retorna um objeto HttpResponse 8,),+5$>&,$+,-5:-,3$/),613,$&$549,85$+,-".$-12$. +,-"./0.$)345%666 -),./012 +,-".$-12$.34 Residência de Reuso - 2011.1 - Recife/PE 40
  41. 41. !"#$%&%($)*$ Exemplo!"#$%&%($)*$ +,-./01%2!""http://mysite.com/time +,-./01%2!""http://mysite.com/time http://mysite.com.time from django.conf.urls.defaults import * * from django.conf.urls.defaults import from mysite.views import hora_actual from mysite.views import hora_actual !"#$%& urlpatterns !"#$%& urlpatterns = urls.py = patterns(, patterns(, (r^time/$, hora_actual), )(r^time/$, hora_actual), ) from django.http import HttpResponse from datetime import datetime from django.http import HttpResponse from datetime import datetime ()*+$%& def hora_actual(request): now = datetime.now() ()*+$%&views.py def hora_actual(request):% now html = "Son las %s." = datetime.now() nowreturn HttpResponse(html) html = "Son las %s." % now return HttpResponse(html) Residência de Reuso - 2011.1 - Recife/PE 41
  42. 42. !"#$%&%($)*$ Exemplo 2 +,-./01%2!""http://mysite.com/time/plus/2 +,-./01%2!""http://mysite.com/time/plus/2 http://mysite.com.time/plus/2 from django.conf.urls.defaults import * from django.conf.urls.defaults import * from mysite.views import dentro_de from mysite.views import dentro_de urls.py !"#$%& !"#$%& urlpatterns = patterns(, urlpatterns = patterns(, (r^time/plus/(d{1,2})/$, dentro_de), (r^time/plus/(d{1,2})/$, dentro_de), ) ) from django.http import HttpResponse from django.http import HttpResponse from datetime import datetime, timedelta from datetime import datetime, timedelta def dentro_de(request, offset):views.py ()*+$%& ()*+$%& def offset = int(offset) dentro_de(request, offset): offset = int(offset) dt = datetime.now() + timedelta(hours=offset) dt = datetime.now() + serán las %s." % (offset, dt) html = "En %i hora(s), timedelta(hours=offset) html = "En %i hora(s), serán las %s." % (offset, dt) return HttpResponse(html) return HttpResponse(html) Residência de Reuso - 2011.1 - Recife/PE 42
  43. 43. Html dentro da views? Residência de Reuso - 2011.1 - Recife/PE 43
  44. 44. !"#$%&"( Templates! "#$%&%()%()*+,-%(.#($)"("*&+,-*(%(/%(-%$%(,.#$#.,#0#1 Separa a camada de apresentação de forma independente ! 2,-3#&45(,.#$#.,#0#5(61307)8 ! Linguagem de marcação embarcada dentro do html (Designers :D) 9#+/%:#(,.#$#.,#0#(6;$%&%(.,5#<%.4&#5=8 Residência de Reuso - 2011.1 - Recife/PE 44
  45. 45. !"#$%&"( Templates ! "#$%&&($#($)*$+,*$)#$*%-#.*/$0#1,2&.#34$5$6*(.#7.348Baseia-se em 2 objetos: ! 9($*%-#.*$!"#$%&"34$:*(+#(#$#2$()*+,$)#$&2;)&$<=#$ String a ser devolvida pelo HttpResponse Template (geralmente HTML) com alguns marcadores <=#>#1*$)#?*2?#>$#($#2$@A,B#,*(#$3(*>1&21#(.#$ especiais de Django. @0CD4E$,#>*$;(:2=5#()*$#+<=#.&$#,#:;&2#$)#$F-&(G*8 ! 9($*%-#.*$-.+"/34$:*(+#(#$=($0*11*.+&)*.$:*($2*$ ?&2*>#$<=#$)&($:*(.#7.*$&$=(&$,2&(+22&E$2*$<=#$)#%#($ Um dicionário com os valores a serem =&>#$,&>&$>#()#>;H&>$=($*%-#.*$0#1,2&.#348 Context renderizados no Template. 0#1,2&.#/ "Bienvenido, {{ user }}." "Bienvenido, alatar." 6*(.#7./ {user: alatar} Residência de Reuso - 2011.1 - Recife/PE 45
  46. 46. !"#$%&"( Exemplo 1! :( )*+#"*&"#$%&()#*(+,"#-"&./012&3"!"#$%&",-,./0"1 from django.http import HttpResponse from django.template import Template, Context from datetime import datetime PLANTILLA = """<html><body> Son las {{ hora }}. </body></html>""" def hora_actual(request): now = datetime.now() t = Template(PLANTILLA) c = Context({hora: now}) html = t.render(c) return HttpResponse(html) Residência de Reuso - 2011.1 - Recife/PE 46
  47. 47. !"#$%&"( Exemplo 2! )"*+,-&"#$%&()#*(+,"#-"&./012&3".$",/0123"&-/0124%.("/0 :| from django.http import HttpResponse from django.template import Template, Context from datetime import datetime def hora_actual(request): now = datetime.now() fp = open(/home/django/templates/hora.html) t = Template(fp.read()) fp.close() c = Context({hora: now}) html = t.render(c) return HttpResponse(html) Residência de Reuso - 2011.1 - Recife/PE 47
  48. 48. !"#$%&"( Exemplo 3!:)!")*")&"#$%&()#*(+,"#-"&./012&3"+","#$%&"-. TEMPLATE_DIRS = ( 405,647$8 /home/django/templates, ) from django.http import HttpResponse from django.template.loader import get_template from django.template import Context from datetime import datetime def hora_actual(request): now = datetime.now() t = get_template(hora.html) c = Context({hora: now}) html = t.render(c) return HttpResponse(html) Residência de Reuso - 2011.1 - Recife/PE 48
  49. 49. !"#$%&"( Exemplo 3! !")*")&"#$%&()#*(+,"#-"&./012&3"+","#$%&"-.:D TEMPLATE_DIRS = ( 405,647$8 /home/django/templates, ) from django.http import HttpResponse from django.template.loader import get_template from django.template import Context from datetime import datetime def hora_actual(request): now = datetime.now() t = get_template(hora.html) c = Context({hora: now}) html = t.render(c) return HttpResponse(html) Residência de Reuso - 2011.1 - Recife/PE 49
  50. 50. !"#$%&"( Exemplo 4 :O! "#$%&()*+,*-.*/(0))"*+"),-,)"($-*("./ from django.shortcuts import render_to_response from datetime import datetime def hora_actual(request): now = datetime.now() return render_to_response(hora.html, {hora: now}) Residência de Reuso - 2011.1 - Recife/PE 50
  51. 51. !"#$%&"()*!+$ !"#$%&"()*!+$ !"#$%&"()*!+$ Lembrete! !"#$%&"()*!+$ !+,-". )"* +,-". TEMPLATE_DIRS = ( ),-/".! ,-". &, !"#$%!&( ! * TEMPLATE_DIRS = ( + +" + /home/django/templates,&, !"#$%!&( ) /home/django/templates,&, !"#$%!&( &, !"#$%!&( ) TEMPLATE_DIRS = TEMPLATE_DIRS = (( /home/django/templates, /home/django/templates, *! )"*!)"+!/ -, ) ) ;-4"3$+<8+.3"*<-9=+,-"> +!/ !/ +-, -, ;-4"3$+<8+.3"*<-9=+,-"> TEMPLATE_LOADERS = ( ;-4"3$+<8+.3"*<-9=+,-"> django.template.loaders.filesystem.load_template_source,-, ;-4"3$+<8+.3"*<-9=+,-"> django.template.loaders.app_directories.load_template_source, ) TEMPLATE_LOADERS = ( TEMPLATE_LOADERS = ( django.template.loaders.filesystem.load_template_source, django.template.loaders.filesystem.load_template_source, django.template.loaders.app_directories.load_template_source, 01+.2+3"4+./templates."!.,*!2+5+.5"$436.5".2+5+.+& django.template.loaders.app_directories.load_template_source, TEMPLATE_LOADERS = ( ) ) django.template.loaders.filesystem.load_template_source, 0 django.template.loaders.app_directories.load_template_source, 76$89"$".9$2-*93.*$+.2+3"4+.26$."-.$6:,3".5".-+.+.63.2-+395+5& ) 0 1+.2+3"4+./templates."!.,*!2+5+.5"$436.5".2+5+.+& 0 1+.2+3"4+./templates."!.,*!2+5+.5"$436.5".2+5+.+& 0 76$89"$".9$2-*93.*$+.2+3"4+.26$."-.$6:,3".5".-+.+.63.2-+395+5& return render_to_response(website/index.html) 0 1+.2+3"4+./templates."!.,*!2+5+.5"$436.5".2+5+.+& 0 76$89"$".9$2-*93.*$+.2+3"4+.26$."-.$6:,3".5".-+.+.63.2-+395+5& return render_to_response(website/index.html) 0 76$89"$".9$2-*93.*$+.2+3"4+.26$."-.$6:,3".5".-+.+.63.2-+395+5& return render_to_response(website/index.html) return render_to_response(website/index.html) Residência de Reuso - 2011.1 - Recife/PE 51
  52. 52. Templates: {{}} !"#$%&"()*++,,Sintaxe simples de templates <html> <head>Ejemplo templates</head>Desacoplado de Python <body> Hola, {{ username }}. </body>HTML com anabolizantes </html>Extensível {username: juan}Designers vão se apaixonar! <html> <head>Ejemplo templates</head> Templates não podem <body> Hola, juan. executar </body> </html> código Python!!!! Residência de Reuso - 2011.1 - Recife/PE 52
  53. 53. Templates: {{}} Tags Residência de Reuso - 2011.1 - Recife/PE 53
  54. 54. !"#$%&"()*&+(*,-*-. Tags/0##"1 {% comment %} Bu! {% endcomment %} 203 {% for elemento in lista %} <li>{{ elemento }}<li> {% endfor %} 42 {% if username == "Juan" %} Hola Juan, me gustas! == != > < >= <= in and or not {% else %} Hola {{ username }}, {% endif %} Residência de Reuso - 2011.1 - Recife/PE 54
  55. 55. !"#$%&"()*+,%"-(Filters <html> <head>Ejemplo templates</head> .%" <body> Hola, {{ username|title }}. </body> </html> {username: juan} <html> <head>Ejemplo templates</head> <body> Hola, Juan. </body> </html> Residência de Reuso - 2011.1 - Recife/PE 55
  56. 56. Filters !"#$%&"()*+,%"-( {value: 123456789} &.. {{ value|add:”1” }} 123456790 /%"(,0"12-#& {{ value|filesizeformat }} 117.7MB {date: datetime.datetime(2010, 9, 11, 17, 1, 59, 385323) } .&" {{ date|date:”d M Y” }} 11 Sep 2010 3#"(,45" {{ date|timesince }} 4 days, 6 hours 3#"643% {{ date|timeuntil }} 1 days, 6 hours Residência de Reuso - 2011.1 - Recife/PE 56
  57. 57. Modelos Nós temos objetos e queremos persistí-los Mapeamento entre Objetos e tabelas Django tem ORM! Residência de Reuso - 2011.1 - Recife/PE 57
  58. 58. !"#$%" Eu crio classes e objetos from django.db import models class Books(models.Model): name = models.CharField(blank=True, max_length=100) created = models.DateTimeField(blank=False) available = models.BooleanField(default=True)!"&#$($#$)*+",-./0 !"#$%&()*"$*+,-.+-,/*"0$"&1),(/.2&"1$23*)+43 !"#$%&()*"3$453*))*"$4"!"#$"%&&()&*"+(,*-.&/"01$2223!"6*)+"0$%&.2&"0$4"()0$4)"!4#"50%6*478"(,*9/#(*(:)3" Residência de Reuso - 2011.1 - Recife/PE 58
  59. 59. !"#$%&(&)$*+,O ORM converte para SQL BEGIN; CREATE TABLE "website_books" ( "id" integer NOT NULL PRIMARY KEY, "name" varchar(100) NOT NULL, "created" datetime NOT NULL, "available" bool NOT NULL ); COMMIT; BEGIN; CREATE TABLE "website_books" ( "id" serial NOT NULL PRIMARY KEY, "name" varchar(100) NOT NULL, "created" timestamp with time zone NOT NULL, "available" boolean NOT NULL ); COMMIT; Residência de Reuso - 2011.1 - Recife/PE 59
  60. 60. Com 1 comando! $ python manage.py syncdb Residência de Reuso - 2011.1 - Recife/PE 60
  61. 61. Configure o seu banco!"#$%&()*+,#%*-./ DATABASE_ENGINE = sqlite3 DATABASE_NAME = db.sqlite DATABASE_USER = DATABASE_PASSWORD = DATABASE_HOST = DATABASE_PORT = settings.py Residência de Reuso - 2011.1 - Recife/PE 61
  62. 62. e se alterar os modelos ? Não atualiza os esquemas existentes! :( GoHorse: Dropa na mão e rexecuta syncdb!Ou aplicações externas: south desed django-evolution yasdel Residência de Reuso - 2011.1 - Recife/PE 62
  63. 63. Exemplo !"#$%&$ python manage.py syncdbCreating table auth_permissionCreating table auth_groupCreating table auth_userCreating table auth_messageCreating table django_content_typeCreating table django_sessionCreating table django_siteCreating table website_tweetYou just installed Djangos auth system, which means you dont have anysuperusers defined.Would you like to create one now? (yes/no): yesUsername (Leave blank to use neo): adminE-mail address: user@example.comPassword:Password (again):Superuser created successfully.Installing index for auth.Permission modelInstalling index for auth.Message modelInstalling index for website.Tweet model Residência de Reuso - 2011.1 - Recife/PE 63
  64. 64. Exercício 03 Criar o backend da sua app seminarios Vamos usar o sqlite3 Residência de Reuso - 2011.1 - Recife/PE 64
  65. 65. Exemplo Hora de fazer montar consultas! Residência de Reuso - 2011.1 - Recife/PE 65
  66. 66. ORM- Consultas !"#$%&()*+,#,(-#*(./0 $ python manage.py shell select * from publisher; ts = Publisher.objects.all() Model Manager QuerySet Residência de Reuso - 2011.1 - Recife/PE 66
  67. 67. !"#$%&())*+%,&-#))./ORM- Consultas >>> Publisher.objects.all() [<Publisher: Publisher object>] class Publisher(models.Model): ... def __unicode__(self): return self.name >>> Publisher.objects.all() [<Publisher: Apress>] Residência de Reuso - 2011.1 - Recife/PE 67
  68. 68. ORM- Inserção !"#$%& o = Model(...) o.save()!" >>> p = Publisher( ... name=Apress, ... address=2855 Telegraph Avenue, ... city=Berkeley, ... state_province=CA, ... country=U.S.A., ... website=http://www.apress.com/) >>> p.save() Residência de Reuso - 2011.1 - Recife/PE 68
  69. 69. !"#$%& !"#$%& ORM- Atualização o.save() o.save() >>> ... >>> p.id! >>> 52 >>> ... p.id >>> p.name = Apress Publishing! 52 >>> p.save() >>> p.name = Apress Publishing >>> p.save() queryset.update(...)" >>> Publisher.objects.all().update(country=USA) 2 Residência de Reuso - 2011.1 - Recife/PE 69
  70. 70. !"#"$" o.delete()ORM- Deleção >>> ... o.delete() >>> p.id! 52 >>> ... >>> p.delete() >>> p.id! 52 >>> p.delete() queryset.delete() >>> ps = queryset.delete() Publisher.objects.all()" >>> ps.delete() >>> ps = Publisher.objects.all()" >>> ps.delete() Residência de Reuso - 2011.1 - Recife/PE 70
  71. 71. !"#"$%&(&)&*(+,-./0!"#"$%&(&)&*(+,-./0 Select 1 resultado .get(...) .get(...) .get(...) >>> Publisher.objects.get(name="Apress") >>> Publisher.objects.get(name="Apress") >>> Publisher.objects.get(name="Apress") <Publisher: Apress> <Publisher: Apress> <Publisher: Apress> >>> Publisher.objects.get(name="Anaya")>>> >>> Publisher.objects.get(name="Anaya") Publisher.objects.get(name="Anaya") Traceback (most recent call last): Traceback (most recent call last):Traceback (most recent call last): ... ... ... DoesNotExist: Publisher matching query does not exist. DoesNotExist: Publisher matching query does exist.DoesNotExist: Publisher matching query does not not exist. >>> Publisher.objects.get(country="U.S.A.")>>> >>> Publisher.objects.get(country="U.S.A.") Publisher.objects.get(country="U.S.A.") Traceback (most recent call last): Traceback (most recent call last):Traceback (most recent call last): ... ... ... MultipleObjectsReturned: get() returned more than one Publisher -- MultipleObjectsReturned: get() returned more than Publisher --MultipleObjectsReturned: get() returned more than one one Publisher -- it returned 2! Lookup parameters were {country: U.S.A.} it returned 2! Lookup parameters were {country: U.S.A.} it returned 2! Lookup parameters were {country: U.S.A.} Residência de Reuso - 2011.1 - Recife/PE 71
  72. 72. !"#"$%&(&)&*(+,-./0+ Select n resultados!"#"$%&(&)&*(+,-./0+!"#"$%&(&)&*(+,-./0+ .all() .all() >>> Publisher.objects.all() .all() [<Publisher: Apress>, <Publisher: OReilly>] >>> Publisher.objects.all() >>> Publisher.objects.all() [<Publisher: Apress>, <Publisher: OReilly>] [<Publisher: Apress>, <Publisher: OReilly>] .filter(...) .filter(...) >>> Publisher.objects.filter( .filter(...) country="U.S.A.", state_province="CA") >>> Publisher.objects.filter( [<Publisher: Apress>] >>> Publisher.objects.filter( country="U.S.A.", state_province="CA") country="U.S.A.", state_province="CA") [<Publisher: Apress>] [<Publisher: Apress>] RETORNAM QUERYSETS e não LISTAS! Residência de Reuso - 2011.1 - Recife/PE 72
  73. 73. !"#$%&()#"*$%+",-)./"$% Manipulação de consultas !"#$%&()#"*$%+",-)./"$% Modelo.objects.filter(campo1="valor1", campo2="valor2") !"#$%&()*+"#$%,*-*.$/.-/0&$),01"$)(#$2,*$/3,&4-&-$567 Modelo.objects.filter(campo1="valor1", campo2="valor2") !"#$%&()*+"#$%,*-*.$/.-/0&$),01"$)(#$2,*$/3,&4-&-$567 campo__exact= campo__gt=0 campo__startswith= campo__iexact= campo__gte=0 campo__istartswith= campo__contains= campo__lt=0 campo__endswith= campo__icontains= campo__gt=0campo__exact= campo__lte=0 campo__iendswith= campo__startswith= campo__isnull=T|Fcampo__iexact= campo__gte=0 ,] campo__istartswith= campo__in=[ campo__range=( ,) campo__day=31campo__contains= campo__month=12 campo__endswith= campo__lt=0 campo__year=2010campo__icontains= campo__lte=0 campo__iendswith=campo__isnull=T|F campo__in=[ ,] campo__range=( ,)campo__day=31 campo__month=12 campo__year=2010 Residência de Reuso - 2011.1 - Recife/PE 73
  74. 74. Order!"#$"%& By !"#$"%& .order_by(...) .order_by(...) >>> Publisher.objects.order_by("name") >>> Publisher.objects.order_by("name") [<Publisher: Apress>, <Publisher: OReilly>] [<Publisher: Apress>, <Publisher: OReilly>] >>> Publisher.objects.order_by("-name") >>> Publisher.objects.order_by("-name") [<Publisher: OReilly>, <Publisher: Apress>] [<Publisher: OReilly>, <Publisher: Apress>] !"#$%#&()*+%,- !"#$%#&()*+%,->>> Publisher.objects.order_by("-name", "country")>>> Publisher.objects.order_by("-name", "country")[<Publisher: OReilly>, <Publisher: Apress>][<Publisher: OReilly>, <Publisher: Apress>] Residência de Reuso - 2011.1 - Recife/PE 74
  75. 75. !"#$%"&()*"+%, !"#$%"&()*"+%, !"#$%"&()*"+%, !"#$%"&()*"+%, Relacionamentos One-to-One OneToOneField OneToOneField OneToOneField class OneToOneField classCoche(models.Model): Coche(models.Model): 44 class Coche(models.Model): motor = =OneToOneField(Motor) motor OneToOneField(Motor) 1 4 class Coche(models.Model): motor = OneToOneField(Motor) 4 motor = OneToOneField(Motor) class Motor(models.Model): class Motor(models.Model): 44 class Motor(models.Model): ... ... 4 class Motor(models.Model): ... 14 ... !"#$%&()$%(&*)&+,*)-.#/&0,(0,&*)(&./(1)/-.)(2 !"#$%&()$%(&*)&+,*)-.#/&0,(0,&*)(&./(1)/-.)(2 !"#$%&()$%(&*)&+,*)-.#/&0,(0,&*)(&./(1)/-.)(2 !"#$%&()$%(&*)&+,*)-.#/&0,(0,&*)(&./(1)/-.)(2 3+)-.)(&)&/%(%1+%( 3+)-.)(&)&/%(%1+%( 3+)-.)(&)&-*$./0 3+)-.)(&)&-*$./0 3+)-.)(&)&/%(%1+%(>>> c.motor >>> c.motor 3+)-.)(&)&-*$./0 >>> m.coche >>> m.coche 3+)-.)(&)&/%(%1+%(<Motor: Motor object> <Motor: Motor object> >>> c.motor 3+)-.)(&)&-*$./0 <Coche: Coche object> <Coche: Coche object> >>> m.coche<Motor: Motor object>>>> c.motor <Coche: Coche object> >>> m.coche<Motor: Motor object> <Coche: Coche object> Residência de Reuso - 2011.1 - Recife/PE 75
  76. 76. !"#$%"&()*"+%, !"#$%"&()*"+%, !"#$%"&()*"+%, Relacionamentos One-to-Many !"#$%"&()*"+%, ForeignKeyField ForeignKeyField ForeignKeyField 44 ForeignKeyField class Blog(models.Model): class Blog(models.Model): ... ... 1 4 class Blog(models.Model): class Blog(models.Model): ... 4 ... class Post(models.Model): class Post(models.Model): // blog ==ForeignKeyField(Blog) blog ForeignKeyField(Blog) class Post(models.Model): / n / class Post(models.Model): blog = ForeignKeyField(Blog) blog = ForeignKeyField(Blog) !"#$%&()$%(&*)&+,*)-.#/&0,(0,&*)(&./(1)/-.)(2 !"#$%&()$%(&*)&+,*)-.#/&0,(0,&*)(&./(1)/-.)(2 !"#$%&()$%(&*)&+,*)-.#/&0,(0,&*)(&./(1)/-.)(2 !"#$%&()$%(&*)&+,*)-.#/&0,(0,&*)(&./(1)/-.)(2 3+)-.)(&)&/%(%1+%( 3+)-.)(&)&/%(%1+%( 3+)-.)(&)&-*$./0 3+)-.)(&)&-*$./0 3+)-.)(&)&/%(%1+%( >>> p.blog >>> p.blog >>> 3+)-.)(&)&-*$./0 >>>b.post_set.all() b.post_set.all() 3+)-.)(&)&/%(%1+%( <Blog: Blog object> <Blog: Blog object> 3+)-.)(&)&-*$./0 [<Post: Post object>, ...] [<Post: Post object>, ...]>>> p.blog >>> b.post_set.all()>>> p.blog<Blog: Blog object> >>> b.post_set.all() [<Post: Post object>, ...]<Blog: Blog object> [<Post: Post object>, ...] Residência de Reuso - 2011.1 - Recife/PE 76
  77. 77. !"#$%"&()*"+%, !"#$%"&()*"+%, !"#$%"&()*"+%, Relacionamentos Many-to-Many ManyToManyField ManyToManyField class Post(models.Model): class Post(models.Model): // ManyToManyField ManyToManyField tags == ManyToManyField(Tag) tags ManyToManyField(Tag) m/ class Post(models.Model): class Post(models.Model): / $ $ class Tag(models.Model): class Tag(models.Model): tags = ManyToManyField(Tag) tags = ManyToManyField(Tag) ... ... class Tag(models.Model): n $ $ class Tag(models.Model): ... !"#$%&()$%(&*)&+,*)-.#/&0,(0,&*)(&./(1)/-.)(2 !"#$%&()$%(&*)&+,*)-.#/&0,(0,&*)(&./(1)/-.)(2 ... 3+)-.)(&)&/%(%1+%( 3+)-.)(&)&/%(%1+%( 3+)-.)(&)&-*$./0 3+)-.)(&)&-*$./0 !"#$%&()$%(&*)&+,*)-.#/&0,(0,&*)(&./(1)/-.)(2 !"#$%&()$%(&*)&+,*)-.#/&0,(0,&*)(&./(1)/-.)(2>>> p.tags.add(t1, t2) >>> p.tags.add(t1, t2) >>> t.post_set.add(p1, p2) >>> t.post_set.add(p1, p2)>>> 3+)-.)(&)&/%(%1+%( >>> p.tags.all() p.tags.all() 3+)-.)(&)&-*$./0 >>> t.post_set.all() >>> t.post_set.all() 3+)-.)(&)&/%(%1+%(...][<Tag: Tag object>, ...] [<Tag: Tag object>, 3+)-.)(&)&-*$./0 ...] [<Post: Post object>, ...] [<Post: Post object>,>>> p.tags.add(t1, t2)>>> p.tags.add(t1, t2) >>> t.post_set.add(p1, p2) >>> t.post_set.add(p1, p2)>>> p.tags.all()>>> p.tags.all() >>> t.post_set.all() >>> t.post_set.all()[<Tag: Tag object>, ...][<Tag: Tag object>, ...] [<Post: Post object>, ...] [<Post: Post object>, Recife/PE Residência de Reuso - 2011.1 - ...] 77
  78. 78. !"#$%"&()*"+%, !"#$%"&()*"+%, !"#$%"&()*"+%, Ponteiros inversos !"#$%&(#)**(#+%&),%(#-"./0)-$-#)*#+-"$).%#/"0).(%!"#$%&(#)**(#+%&),%(#-"./0)-$-#)*#+-"$).%#/"0).(% !"#$%&(#)**(#+%&),%(#-"./0)-$-#)*#+-"$).%#/"0).(% 1classclass Blog(models.Model): class Blog(models.Model): + classBlog(models.Model): Blog(models.Model): ++ ... ... ... ... class Post(models.Model): class Post(models.Model): ( classPost(models.Model): (( n class Post(models.Model): blog = ForeignKeyField(Blog, related_name=posts) blog = ForeignKeyField(Blog, related_name=posts) blog = = ForeignKeyField(Blog, related_name=posts) blog ForeignKeyField(Blog, related_name=posts) !"#$%#&#()&)*")& !"#$%#&#1*$.2/ !"#$%#&#()&)*")& !"#$%#&#()&)*")& !"#$%#&#1*$.2/ !"#$%#&#1*$.2/ >>> p.blog >>> p.blog >>> b.posts.all() >>> b.posts.all() >>> <Blog: Blog object> p.blog >>> p.blog >>> [<Post: Post object>, ...] b.posts.all() >>> b.posts.all() <Blog: Blog object> [<Post: Post object>, ...] <Blog: Blog object> <Blog: Blog object> [<Post: Post object>, ...] [<Post: Post object>, ...] 1-"&%#23#3-"#$+4/.",".%-"30/&"#/,4#().5#/)#42$%/-4/1-"&%#23#3-"#$+4/.",".%-"30/&"#/,4#().5#/)#42$%/-4/ 1-"&%#23#3-"#$+4/.",".%-"30/&"#/,4#().5#/)#42$%/-4/ Residência de Reuso - 2011.1 - Recife/PE 78
  79. 79. Laziness !"#$%& !"#$%&#$%&($)*+#$%()*%$,%,-,&)+#./(%&)#(0%.,#*1,(+,%$,% Otimização!! Consulta só realizada quando necessário!,&,$2+,%3+,(,.%*$%3-,+$4%5(%*#$%$26)2,(+,$%$2+)#&2(,$7#$%&($)*+#$%()*%$,%,-,&)+#./(%&)#(0%.,#*1,(+,%$,% ! 8+,.#&2(,$,&,$2+,%3+,(,.%*$%3-,+$4%5(%*#$%$26)2,(+,$%$2+)#&2(,$7 for p in Publisher.objects.all(): ! 8+,.#&2(,$ ! 9*2&2(6 for p in Publisher.objects.all(): Publisher.objects.filter(country=USA)[0] ! 9*2&2(6 ! 9,.2#*2:#&2;( Publisher.objects.filter(country=USA)[0] <=#&>?@ ! 9,.2#*2:#&2;( • repr() <=#&>?@ [<Publisher: Publisher object>] • len() !!! repr() [<Publisher: Publisher object>] len(Publisher.objects.all()) • list() !!! len() len(Publisher.objects.all()) list(Publisher.objects.all()) Residência de Reuso - 2011.1 - Recife/PE • bool() list() list(Publisher.objects.all()) if Publisher.objects.filter(country=USA): 79
  80. 80. Exercício 04!"#$%&!()*(+&"(*,(-(+&#./)*(&0&$(1(*( Residência de Reuso - 2011.1 - Recife/PE 80
  81. 81. Interface Administrativa Residência de Reuso - 2011.1 - Recife/PE 81
  82. 82. Interface Administrativa Residência de Reuso - 2011.1 - Recife/PE 82
  83. 83. djang.contrib.admin Instalação 1/3 Residência de Reuso - 2011.1 - Recife/PE 83
  84. 84. djang.contrib.admin!"#$%&#()*$+,$-.#/#0*1$ Instalação 2/3 !"#$%!&( INSTALLED_APPS = ( django.contrib.auth, django.contrib.contenttypes, django.contrib.sessions, django.contrib.sites, django.contrib.admin, 1 ... ) Residência de Reuso - 2011.1 - Recife/PE 84
  85. 85. !"#$%&(%)*+,&%,-.djang.contrib.admin !"#$%&(%)*+,&%,-. Instalação 3/3 $ python manage.py syncdb $ python manage.py syncdb Creating table django_admin_log Creating table django_admin_log Installing index for admin.LogEntry model Installing index for admin.LogEntry model Acesse http://localhost:8000/admin !"#$%&$()*&+*,*&-(*, !"#$%&$()*&+*,*&-(*, Residência de Reuso - 2011.1 - Recife/PE 85
  86. 86. !"#$%&( Opa! Falta registrar os modelos! "#$#%!%$&&%$&%(&)&*%&+%,-./0! 1&2)&%3-4%5/$&+/,%,&*6)%78,8+&,%$&,$&%&+%#$58)%.% Criar o módulo admin.py 9&*58(&%9&*,/)#+8:#*%,-%#,9&;(/0 ser configurável! Cada app deve ter o seu, pode from django.contrib import admin from website.models import Tweet class TweetAdmin(admin.ModelAdmin): list_display = (id,user,message,timestamp) admin.site.register(Tweet, TweetAdmin) Residência de Reuso - 2011.1 - Recife/PE 86
  87. 87. Exercício 04 !"#$%&#(") Residência de Reuso - 2011.1 - Recife/PE 87
  88. 88. !"#$%$&()*"+,-#.#$ !"#$%$&()*"+,-#.#$ Forms3 componentesWidgetWidget !"#$"%&%&()$+#"(&)*+,-.&%&(-(/012 !"#$"%&%&()$+#"(&)*+,-.&%&(-(/012 Componente Visual Widget !"#$"%&%&()$+#"(&)*+,-.&%&(-(/012 Widget TextInput <input type=text...> TextInput <input type=text...> TextInput <input type=text...> CheckboxInput <input type=checkbox...> CheckboxInput <input type=checkbox...> CheckboxInput <input type=checkbox...>FieldField /01,#(3&(*%(4-#$"5(-6"4+-3"(-(*%(7+38& /01,#(3&(*%(4-#$"5(-6"4+-3"(-(*%(7+38& Field /01,#(3&(*%(4-#$"5(-6"4+-3"(-(*%(7+38& Campo Lógico EmailField Field EmailField EmailField widget, initial, error, ... IPAddressField widget, initial, error, ... IPAddressField widget, initial, error, ... IPAddressField Form Form !*(2+(3*(3&(9+&.36(3&(*%(:";#*.-;+" Formulário em si Form Form !*(2+(3*(3&(9+&.36(3&(*%(:";#*.-;+" !*(2+(3*(3&(9+&.36(3&(*%(:";#*.-;+" ContactForm [nombre, email, telefono, mensaje, ...] ContactForm [nombre, email, telefono, mensaje, ...] ContactForm [nombre, email, telefono, mensaje, ...] Residência de Reuso - 2011.1 - Recife/PE 88
  89. 89. Criação de Formulário Passo 1: Definição de um formulário forms.pyhttp://docs.djangoproject.com/en/dev/ref/forms/fields/ Residência de Reuso - 2011.1 - Recife/PE 89
  90. 90. Criação de Formulário Passo 2: Definição do template do Formulário contato.html Residência de Reuso - 2011.1 - Recife/PE 90
  91. 91. Criação de Formulário Passo 3: Definição da view do Formulário Residência de Reuso - 2011.1 - Recife/PE 91
  92. 92. !"#$%"&$()*+,*$"Criação de Formulário !"#$%"&()"*)+%+),+-.#+/.01$23)++&"/.+#++/+#+4.$-# Forms tem validação própria! Cool :D#$-5")%6-+)."$&/).7.$1#"61%83"#"clean_<fieldname>9 from django import forms class ContactForm(forms.Form): subject = forms.CharField(max_length=100) email = forms.EmailField(required=False) message = forms.CharField(widget=forms.Textarea) def clean_message(self): message = self.cleaned_data[message] num_words = len(message.split()) if num_words < 4: raise forms.ValidationError("Not enough words!") return message Residência de Reuso - 2011.1 - Recife/PE 92
  93. 93. Forms a partir de Models !"#$%&&(#)#&*+&,"*+-% Aqui é DRY meu caro!! from django.db import models class Author(models.Model):!"#$%&() name = models.CharField(max_length=100) birth_date = models.DateField(blank=True, null=True) country = models.ModelChoiceField(Country) ... from django import forms from books.models import Author ."#$%/(0 class AuthorForm(forms.ModelForm): class Meta: model = Author exclude = (country,) Residência de Reuso - 2011.1 - Recife/PE 93
  94. 94. Exercício 04 Alguns truques agora... Residência de Reuso - 2011.1 - Recife/PE 94
  95. 95. Django Avançado 1. Middleware 2. Caching 3. Deploying 4. Apps Recomendadas Residência de Reuso - 2011.1 - Recife/PE 95
  96. 96. Django Avançado 1. Middleware 2. Caching 3. Deploying 4. Apps Recomendadas Residência de Reuso - 2011.1 - Recife/PE 96
  97. 97. !"##$%&(% MiddlewarePermite incrementar a funcionalidade injetando fluxo de !"#$%&()*&$&#+),)$-./+)"/01)202$&.31)40,1&$ execução em Django 5.&$#&$)/#&*0$&/$&1$6.7"$2&$&7&+.+)8/$2&$970/:" Residência de Reuso - 2011.1 - Recife/PE 97
  98. 98. Middleware !"##$%&(%class MyMiddleware(object): def process_request(self, request): """Se ejecuta antes de que Django decida a quâˆ!© View llamar. -> HttpRequest(): Se corta el flujo de middleware. -> None: El flujo sigue con el siguiente middleware.""" # ... def process_view(self, request, view_func, view_args, view_kwargs): """Se ejecuta antes de que se llame a la View. -> HttpRequest(): Se corta el flujo de middleware. -> None: El flujo sigue con el siguiente middleware.""" # ... def process_response(self, request, response): """Se ejecuta despuâˆ!©s de que la View devuelva una response. -> HttpResponse()""" # ... def process_exception(self, request, exception): """Se ejecuta cuando una View lanza una excepciâˆ!≥n. -> HttpResponse(). -> None: La excepciâˆ!≥n se propaga hasta el cliente.""" # ... Residência de Reuso - 2011.1 - Recife/PE 98
  99. 99. !"##$%&(% Middleware!"#"$%&()"*#+,)*-#)"&.-%$*//,"01-""#",,)21-()"#%&+%#3"#214)%*"%*#+,%*,-.%*),%$,+(#%*,#%, %/%-.-"0*,%*,$,1%2.%3),4,%*,$,1%35+*3%5 Registrar o middlewares no settings.pyMIDDLEWARE_CLASSES = ( django.middleware.common.CommonMiddleware, django.contrib.sessions.middleware.SessionMiddleware, django.middleware.csrf.CsrfViewMiddleware, django.contrib.auth.middleware.AuthenticationMiddleware, django.contrib.messages.middleware.MessageMiddleware,) Residência de Reuso - 2011.1 - Recife/PE 99
  100. 100. Django Avançado 1. Middleware 2. Caching 3. Deploying 4. Apps Recomendadas Residência de Reuso - 2011.1 - Recife/PE 100
  101. 101. Caching !"!#$%& Sempre importante estar aliviando o banco de consultas... $()* !"!#$%& from django.views.decorators.cache import cache_page @cache_page(60 * 15) def my_view(request):()*+,+ ... >>> from django.core.cache import cache >>> cache.set(my_key, hello, world!, 30) >>> cache.get(my_key) hello, world! Residência de Reuso - 2011.1 - Recife/PE ! "#$%&#()*)+%*,()-*./-0%,(12#($%(#34%5#(/-%(%(2-%$*(%,0*.06*,7 101
  102. 102. Django Avançado 1. Middleware 2. Caching 3. Deploying 4. Apps Recomendadas Residência de Reuso - 2011.1 - Recife/PE 102
  103. 103. Deploying Por o sistema em produção VirtualEnv + PIP + Fabric Residência de Reuso - 2011.1 - Recife/PE 103
  104. 104. !"#$%&()* ! "#$%&%#$%#()*+,&-%.)*$%*-)/*-(01%12)/*$%-*/(.%,)3 Virtualenv ! 4)$)*&1+5%.+*6%#%*/7*87%9+*$%*-(01%12)/*%#*-)*:%1/(;#*<7%*#%%/(.) "#$%&%#$%#()*+,&-%.)*$%*-)/*-(01%12)/*$%-*/(.%,)3 ! =(#*,(%$+*)*).7)-(>)1 ! 4)$)*&1+5%.+*6%#%*/7*87%9+*$%*-(01%12)/*%#*-)*:%1/(;#*<7%*#%%/(.) ! =(#*,(%$+*)*,(91)1 =(#*,(%$+*)*).7)-(>)1 Projeto independente do sistema ! %.333 =(#*,(%$+*)*,(91)1 Ou seja cada projeto com suas dependências ! %.333+#(&# específicas+#(&# $ virtualenv --no-site-packages mi_entorno $ virtualenv --no-site-packages mi_entorno&+,*&# $ source mi_entorno/bin/activate Adeus dor de cabeça de migrar, atualizar, etc. Residência de Reuso - 2011.1 - Recife/PE 104
  105. 105. Pip !"! !"! ! "#$%&()#(*+,-#%#$()#.($/0.&(12(34 Gerenciador de Pacotes! ! 5#6/%#(#$*#7/87+(-9(87:#&()#(;<=>?;<@<ABC(7&9(-9(./$%+)&()#( "#$%&()#(*+,-#%#$()#.($/0.&(12(34! 5#6/%#(#$*#7/87+(-9(87:#&()#(;<=>?;<@<ABC(7&9(-9(./$%+)&()#( *+,-#%#$(+(/9$%+.+D uma lista de requisitos (requirements) Você pode criar *+,-#%#$(+(/9$%+.+D para instalação automática! :D 4E+90&FF2D1D2 4E+90&FF2D1D2 *$G7&*01 *$G7&*01 H##)*+$#FFID2 H##)*+$#FFID2 $%/*&0+6FF2DJ $%/*&0+6FF2DJ "K:+%L+**#FFMDN "K:+%L+**#FFMDN pip install -E mi_entorno -r REQUIREMENTS pip install -E mi_entorno -r REQUIREMENTS Residência de Reuso - 2011.1 - Recife/PE 105
  106. 106. !"#$%& Fabric !"#$%&““Repetition leads to boredom, boredom to horrifying mistakes, “Repetition leads to boredom, boredom to horrifying mistakes,horrifying mistakes to God-I-wish-I-was-still-bored Repetition leads to boredom, boredom to horrifying mistakes, horrifying mistakes to God-I-wish-I-was-still-bored” horrifying mistakes to God-I-wish-I-was-still-bored "#()*+,- "#()*+,- env.user = "example" env.hosts = ["example.com"] def deploy(): env.user = "example" run(svn up /home/example/) env.hosts = ["example.com"] sudo(/etc/init.d/lighttpd restart) def deploy(): run(svn up /home/example/) sudo(/etc/init.d/lighttpd restart) ./0 fabric deploy Residência de Reuso - 2011.1 - Recife/PE 106
  107. 107. Django Avançado 1. Middleware 2. Caching 3. Deploying 4. Apps Recomendadas Residência de Reuso - 2011.1 - Recife/PE 107
  108. 108. %6*896(,%;6*8968.1<+,=>%%?/,02(,/%%?/,02(,/%*.3#:,(,% django-registration%?/,02(,/%*:.2,4%%?:.01%%?:.0.)(%%?#622@./4%*!610,% Sistema completo de cadastro de usuários%?#622@./4%*!610,%4.1,%%?#622@./4%/,2,(% DRY!!%?#622@./4%/,2,(%*.1A/3%;(.+,1>%?#622@./4%/,2,(%*.3#:,(,% Instalação Copy and Paste%?#622@./4%/,2,(%4.1,%%?/,6*896(,% !"#$%%&(&)*+,(-./0%)&,/1.2(/)3%45610.7/,02(/68.1% Residência de Reuso - 2011.1 - Recife/PE 108
  109. 109. django-socialregistration; <-2=&)80,>2?192,770; @)(92:,0,>2?,-2$ O django-registration só que anabolizado! ; (A"98B?C0,9*--3B?-0)(!B?-#924; D2(9&80,>2?#98C9,(0?,-2?,-2(8*+0)(! Autenticação com Twitter, Facebook, oAuth, openID Integração perfeita com django.contrib.auth !"#$%%&(!)*+,-.%/01!2&#).#32%4502&-61-,0789&1(80:-2 Residência de Reuso - 2011.1 - Recife/PE 109
  110. 110. django-piston: ;</59,7./+;#5/5;*/,5/;=>?2;@ABCD)E: ;F)G;DH*E;32(5E5*I3 !"#$%&()*+&$ Framework Django para construção de serviços RESTful: ;B,/5EJ5*I3;5$ Fácil de instalar : ;</59,7./+;#5/5;*/,5/;=>?2;@ABCD)E : KBLMN;O=FPN;>G(!.3;>G*+E,N;QFP;--- : ;F)G;DH*E;32(5E5*I3 Suporte para YAML, JSON, XML, etc. : ;B,/5EJ5*I3;5$: L=)(! OAuth : KBLMN;O=FPN;>G(!.3;>G*+E,N;QFP;---: @,*.9,3454.;RRRRR : L=)(! : @,*.9,3454.;RRRRR !"#$%%&(&)*+,(-./0%1,2#,/3%41530.6#2(.3%7+%8.9, !"#$%%&(&)*+,(-./0%1,2#,/3%41530.6#2(.3%7+%8.9, Residência de Reuso - 2011.1 - Recife/PE 110
  111. 111. Apenas uma ponta do iceberg Residência de Reuso - 2011.1 - Recife/PE 111
  112. 112. Lembre-se da comunidade! http://python.org.br http://djangobrasil.org http://pug-pe.python.org.br #django-br #python-br Residência de Reuso - 2011.1 - Recife/PE 112
  113. 113. Trabalho da Semana Trabalho para 5 pessoas Criar um sistema em Django com o assunto visto até aqui O sistema deve ter no mínimo 10 entidades O sistema deve ter controle de acesso (ver django-registration) Modelagem vocês decidemApresentar pontos positivos e negativos durante o uso da tecnologia Residência de Reuso - 2011.1 - Recife/PE 113
  114. 114. Referências e Créditos Desenvolvimento web com Python e Django http://www.slideshare.net/igorsobreira/desenvolvimento-web-com-python-e-djangoDjango: Disfruta Programando http://www.slideshare.net/etox/django-eghost-2010Tutoriais DjangoBrasil http://docs.djangobrasil.org/intro/tutorial01.html Residência de Reuso - 2011.1 - Recife/PE 114
  115. 115. BibliografiaThe Definitive Guide to Django: Web Development Done Right. AdrianHolovaty, Jacob K. Ed. Appress ISBN-13: 978-1430219361Pro Django (1st ed.) Marty Alchin. 2008. . Apress, Berkely, CA, USA. ISBN -1430210478Python e Django - Desenvolvimento Ágil de Aplicações Web - OsvaldoSantana Neto e Thiago Galesi; Editora Novatec ISBN. 9788575222478. Residência de Reuso - 2011.1 - Recife/PE 115
  116. 116. Apresentando Marcel P. Caraciolo caraciol@gmail.com Residência RISE - 2011 116
  117. 117. Exercício 01Vamos construir um mini-sistema de submissão de palestras do nosso seminário 1. Criar um projeto seminario 2. Criar uma app trabalhos3. Criar uma view index redirecionando para uma página html de boas vindas usando templates. Residência de Reuso - 2011.1 - Recife/PE 117
  118. 118. Exercício 05 Vamos criar a nossa interface administrativa para o nossos modelos recém-criados Residência de Reuso - 2011.1 - Recife/PE 118
  119. 119. Exercício 04 Vamos criar os modelos para Trabalho e Palestrante Trabalhousuario: Usertitulo: String Palestrantedescricao: String 1. * * nameslides: Filestatus: Integer Residência de Reuso - 2011.1 - Recife/PE 119
  120. 120. Exercício 02 Vamos criar 2 novos templates 1.trabalhos.html 2. detalhes.html Residência de Reuso - 2011.1 - Recife/PE 120
  121. 121. Exercício 06Vamos construir um formulário simples de submissão de palestras! Residência de Reuso - 2011.1 - Recife/PE 121
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×