Sei sulla pagina 1di 121

Apresentando

Marcel P. Caraciolo
@marcelcaraciolo
Residncia RISE - 2011
1
Esta palestra est sobre a licena Creative Commons
Residncia de Reuso - 2011.1 - Recife/PE
ou seja distribuir , modicar e copiar tudo liberado :D
mas sempre cite a original nos seus crditos
http://creativecommons.org/licenses/by-sa/3.0/
Esta aula faz parte do curso de Residncia de Reuso de Software pela RISE
2
O que Django ?
Residncia de Reuso - 2011.1 - Recife/PE
3
O que Django ?
No Jungle. Django.
4
No Django Reinhardt ... na verdade
5
um framework web
Criado em 2005
Lawrence, Kansas -
Lawerence Journal World
Licena BSD
Aplicao Web
Residncia de Reuso - 2011.1 - Recife/PE
6
um framework web
Criado em 2005
Lawrence, Kansas -
Lawerence Journal World
Licena BSD
Aplicao Web
http://www.ickr.com/photos/plinton/215437652/
DRY
Dont Repeat Yourself
7
Django Python!
Escrito em Python
Focado em
Desenvolvimento gil
Dont Repeat yourself
!"#$%&'()*"*
!
*+"(,%-'./0.
!"#$$$%&'(&)*+,
Residncia de Reuso - 2011.1 - Recife/PE
8
Projeto == Vrias aplicaes
http://djangopackages.com
django.contrib.admin
django.contrib.comments south
django-pagination django-mailer
django-registration
...
Residncia de Reuso - 2011.1 - Recife/PE
9
E isto MVC ?
Models
Controllers Views
Residncia de Reuso - 2011.1 - Recife/PE
10
Alguns chamam de MTV
Residncia de Reuso - 2011.1 - Recife/PE
11
Alguns chamam de MTV
Model - Template - Views
12
Aplicaes
Deve fazer uma coisa, e fazer direito
Se a descrio de sua aplicao for maior que uma
linha, talvez ela precise ser quebrada
Reutilizvel (DRY se lembra ?)
Talvez j exista!
Residncia de Reuso - 2011.1 - Recife/PE
13
Instalando a aplicao
Aplicaes
Coloque no path (PYTHONPATH)
Coloque no INSTALLED_APPS no settings.py
settings.py
Residncia de Reuso - 2011.1 - Recife/PE
14
Aplicaes
A aplicao auto-contida
tests.py
urls.py
templates/
admin.py
Residncia de Reuso - 2011.1 - Recife/PE
15
Fcil de Usar
$ pip install django
$ django-admin.py startproject dwitter
Residncia de Reuso - 2011.1 - Recife/PE
16
Fcil de Usar
$ pip install django
$ django-admin.py startproject dwitter
!"#$"%&'#()"*%+"*,#-)*
$ django-admin.py startproject dwitter
!"#$%&'"(%")*"+,'-(.&'///"0"%%./%*(%0#%1/%2#3#444
__init__.py
manage.py
settings.py
urls.py
!".51"23%+'*(4'%"2(")*"+,'-(.&'"5!"#$%&#'(6"(*"278*9'/
6#%7%8-9#"*(%:;<
Residncia de Reuso - 2011.1 - Recife/PE
17
Fcil 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 !
Residncia de Reuso - 2011.1 - Recife/PE
18
Fcil de Usar
Residncia de Reuso - 2011.1 - Recife/PE
19
Quem usa ?
!"#$$$
!"#$%&'#()'*+)&,-.
Residncia de Reuso - 2011.1 - Recife/PE
20
Documentao
21
Banco de Dados
!"#$%
22
Banco de Dados
!"#$%&'()*+
def 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})
Residncia de Reuso - 2011.1 - Recife/PE
23
Banco de Dados
12 llneas de !"#$%&... _
12 linhas em Python ... :(
24
Banco de Dados
12 linhas em Python ... :(
!"#$%!&'()*+"(,-./0-,$1-223045
25
ORM
Padro Active Record
Classe Table
!"#$%&'()*+
def book_list(request):
names = Books.objects.all().order_by('name')
return render_to_response('book_list.html', {'names':names})
Residncia de Reuso - 2011.1 - Recife/PE
26
Criar tabelas?! Fcil!
$ python manage.py syncdb
Crie as tabelas no banco. E pronto!
Residncia de Reuso - 2011.1 - Recife/PE
27
Vamos comear ?
djangoproject.com - site ocial
djangobrasil.org - site ocial nacional
djangogigs.com - vagas de empregro
djangopeople.net - rede social
djangosites.org - rede social de sites em django
djangosearch.com - busca assuntos relacionados
djangocodesearch.com - busca nos fontes
Residncia de Reuso - 2011.1 - Recife/PE
28
Vamos prtica!
Residncia de Reuso - 2011.1 - Recife/PE
29
Instalao Python
http://www.python.org/download
sudo apt-get install python
Residncia de Reuso - 2011.1 - Recife/PE
!"#$%&'()(*+,%#-.'/0%
$ sudo apt-get install python
http://www.python.org/download/
!"#$%&'#()*+%,"-./0'%.)1%2'*1,#"'1%2.5.4%0%2.6.1
!"#$%&'()(*+,%#-.'/0%
$ sudo apt-get install python
http://www.python.org/download/
!"#$%&'#()*+%,"-./0'%.)1%2'*1,#"'1%2.5.4%0%2.6.1
!"#$%&'()(*+,%#-.'/0%
$ sudo apt-get install python
http://www.python.org/download/
!"#$%&'#()*+%,"-./0'%.)1%2'*1,#"'1%2.5.4%0%2.6.1
J vem com python instalado
30
Instalao de Banco de Dados
Poderamos escolher dentre vrios SGBDs
Residncia de Reuso - 2011.1 - Recife/PE
!"#$%&'(')&#)*"+"'),-).(/-),-)0(+"/1
2
)3$45(6-/1)
2
)7"/+%'-89:
2
);<89:
2
)3'(46-
2
)!"#$%&
2
)!"*&#5,(,1)
2
)8<=(/-)89:)>#<?@-'-
2
)A.;)0.B
2
);54'"/"C)89:)8-'D-')BEEF
2
)G5'-=5',
2
)30.!
'()*+,%-.-/$0+)!123
31
Instalao de Banco de Dados
Vamos usar o Sqlite!
Residncia de Reuso - 2011.1 - Recife/PE
Precisa instalar ?! No :D
Python j vem com SGBD incluso!
http://docs.python.org/library/sqlite3.html
32
Instalao de Django
3 maneiras!
Residncia de Reuso - 2011.1 - Recife/PE
apt-get install python-django
http://www.djangoproject.com/download
python setup.py install
http://www.djangoproject.com/svn/django/trunk
33
Instalao de Django
Residncia de Reuso - 2011.1 - Recife/PE
!""#$%&'()
>>> import django
>>> django.VERSION
(1, 1, 0, 'final', 0)
>>> import django
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named django
!""#$%&'()
>>> import django
>>> django.VERSION
(1, 1, 0, 'final', 0)
>>> import django
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named django
!""#$%&'()
>>> import django
>>> django.VERSION
(1, 1, 0, 'final', 0)
>>> import django
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named django
!""#$%&'()
>>> import django
>>> django.VERSION
(1, 1, 0, 'final', 0)
>>> import django
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named django
34
Criando um projeto
Residncia de Reuso - 2011.1 - Recife/PE
!"#$"%&'#()"*%+"*,#-)*
$ django-admin.py startproject dwitter
!"#$%&'"(%")*"+,'-(.&'///"0"%%./%*(%0#%1/%2#3#444
__init__.py
manage.py
settings.py
urls.py
5#%6%7-8#"*(%9:;
$ django-admin.py startproject seminario
35
Criando um projeto
Residncia de Reuso - 2011.1 - Recife/PE
!"#$%!&'(
36
Criando um projeto
Residncia de Reuso - 2011.1 - Recife/PE
!""#$%#"&$'()*"+&,"+-(%*+
.(&/&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.
37
Entendendo sua App
Residncia de Reuso - 2011.1 - Recife/PE
!"#$%&$'()&*+
!!"#$!%&%!+,%- "'()*%&%.%/0-)1% #!+),!$*"!,%&%234-"5%6
38
urls.py
Residncia de Reuso - 2011.1 - Recife/PE
Mdulo urls.py serve como porta de entrada para requisies HTTP
As URLs so denidas por expresses regulares que redirecionam as
requisies para as respectivas views
!"#$%&%'($)*$
-
Ll chero +,-$./& acLua como puerLa de enLrada para las
peuclones P11
-
Se denen u8Ls eleganLes medlanLe expreslones regulares
que redlrlgen a funclones de 0(12$./&
urls.py
vlews.py
hup://myslLe.com/abouL/
hLml
...
urlpauerns?
39
views.py
Residncia de Reuso - 2011.1 - Recife/PE
Mdulo views.py tem funes com parmetros um objeto HttpRequest
Retorna um objeto HttpResponse
!"#$%&%'($)*$
!
"#$%&'()*'$+,$-),./012$3,()4,$(565$1#376,835/$&'$549,85$
+,-"./0.$)$2$85+5/$:5/$1#376,835/$+,$:#$;<"$(#18&3#+5/=$
8,'),'+5$>&,$+,-5:-,3$/),613,$&'$549,85$+,-".$-12$.
-),./012
+,-"./0.$)345%666
+,-".$-12$.34
40
Exemplo
Residncia de Reuso - 2011.1 - Recife/PE
!"#$%&%'($)*$
+,-./01%2!""http://mysite.com/time
from django.conf.urls.defaults import *
from mysite.views import hora_actual
urlpatterns = patterns('',
(r'^time/$', hora_actual),
)
from django.http import HttpResponse
from datetime import datetime
def hora_actual(request):
now = datetime.now()
html = "Son las %s." % now
return HttpResponse(html)
!"#$%&'
()*+$%&'
urls.py
!"#$%&%'($)*$
+,-./01%2!""http://mysite.com/time
from django.conf.urls.defaults import *
from mysite.views import hora_actual
urlpatterns = patterns('',
(r'^time/$', hora_actual),
)
from django.http import HttpResponse
from datetime import datetime
def hora_actual(request):
now = datetime.now()
html = "Son las %s." % now
return HttpResponse(html)
!"#$%&'
()*+$%&'
views.py
http://mysite.com.time
41
Exemplo 2
Residncia de Reuso - 2011.1 - Recife/PE
urls.py
views.py
http://mysite.com.time/plus/2
!"#$%&%'($)*$
from django.conf.urls.defaults import *
from mysite.views import dentro_de
urlpatterns = patterns('',
(r'^time/plus/(\d{1,2})/$', dentro_de),
)
from django.http import HttpResponse
from datetime import datetime, timedelta
def dentro_de(request, offset):
offset = int(offset)
dt = datetime.now() + timedelta(hours=offset)
html = "En %i hora(s), sern las %s." % (offset, dt)
return HttpResponse(html)
!"#$%&'
()*+$%&'
+,-./01%2!""http://mysite.com/time/plus/2
!"#$%&%'($)*$
from django.conf.urls.defaults import *
from mysite.views import dentro_de
urlpatterns = patterns('',
(r'^time/plus/(\d{1,2})/$', dentro_de),
)
from django.http import HttpResponse
from datetime import datetime, timedelta
def dentro_de(request, offset):
offset = int(offset)
dt = datetime.now() + timedelta(hours=offset)
html = "En %i hora(s), sern las %s." % (offset, dt)
return HttpResponse(html)
!"#$%&'
()*+$%&'
+,-./01%2!""http://mysite.com/time/plus/2
42
Residncia de Reuso - 2011.1 - Recife/PE
Html dentro da views?
43
Templates
Residncia de Reuso - 2011.1 - Recife/PE
Separa a camada de apresentao de forma independente
Linguagem de marcao embarcada dentro do html (Designers :D)
!"#$%&'"(
!
"#$%&%'()%()*+,-%(.#($)"("*'&+,-*(%(/'%(-%$%(,'.#$#'.,#'0#1
!
2,-3#&45(,'.#$#'.,#'0#5(61307)8
!
9#'+/%:#(,'.#$#'.,#'0#(6;$%&%(.,5#<%.4&#5=8
44
Templates
Residncia de Reuso - 2011.1 - Recife/PE
Baseia-se em 2 objetos:
Template
String a ser devolvida pelo HttpResponse
(geralmente HTML) com alguns marcadores
especiais de Django.
Context
Um dicionrio com os valores a serem
renderizados no Template.
!"#$%&'"(
-
Se basan en dos upos de ob[eLos: 1emplaLe() y ConLexL().
-
un ob[eLo !"#$%&'"() conuene el (')*+, de sallda que
queremos devolver en el Pup8esponse (normalmenLe
P1ML), pero lncluyendo euqueLas especlales de u[ango.
-
un ob[eLo -.+'"/'() conuene un 0*11*.+&)*. con los
valores que dan conLexLo a una planulla, los que deben
usarse para renderlzar un ob[eLo 1emplaLe().
"Bienvenido, {{ user }}."
{'user': 'alatar'}
1emplaLe:
ConLexL:
"Bienvenido, alatar."
45
Exemplo 1
Residncia de Reuso - 2011.1 - Recife/PE
!"#$%&'"(
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)
!
)*+#"*&"#$%&'()#*(+,"#-"&./012&3"!"#$%&'",-,./0'"1'
:(
46
Exemplo 2
Residncia de Reuso - 2011.1 - Recife/PE
!"#$%&'"(
!
)"*+,-&"#$%&'()#*(+,"#-"&./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)
:|
47
Exemplo 3
Residncia de Reuso - 2011.1 - Recife/PE
!"#$%&'"(
-
!")*")& aproxlmacln al ob[euvo: +"','"#$%&'"-.
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)
TEMPLATE_DIRS = (
'/home/django/templates',
)
semngs.py
:)
48
Exemplo 3
Residncia de Reuso - 2011.1 - Recife/PE
!"#$%&'"(
-
!")*")& aproxlmacln al ob[euvo: +"','"#$%&'"-.
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)
TEMPLATE_DIRS = (
'/home/django/templates',
)
semngs.py
:D
49
Exemplo 4
Residncia de Reuso - 2011.1 - Recife/PE
!"#$%&'"(
!
"#$%&'()*+,*-.*/(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})
:O
50
Lembrete!
Residncia de Reuso - 2011.1 - Recife/PE
!"#$%&'"()*!+$
TEMPLATE_DIRS = (
'/home/django/templates',
)
semngs.py
8
e
u
s
a
b
l
e

a
p
p
s
?
&,
-,
-
La carpeLa /templates es buscada denLro de cada app.
-
Convlene lnclulr una carpeLa con el nombre de la app por clarldad.
TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.load_template_source',
'django.template.loaders.app_directories.load_template_source',
)
return render_to_response('website/index.html')
AlLernauva reuullzable:
!"#$%&'"()*!+$
TEMPLATE_DIRS = (
'/home/django/templates',
)
semngs.py
8
e
u
s
a
b
l
e

a
p
p
s
?
&,
-,
-
La carpeLa /templates es buscada denLro de cada app.
-
Convlene lnclulr una carpeLa con el nombre de la app por clarldad.
TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.load_template_source',
'django.template.loaders.app_directories.load_template_source',
)
return render_to_response('website/index.html')
AlLernauva reuullzable:
!"#$%&'"()*!+$
TEMPLATE_DIRS = (
'/home/django/templates',
)
semngs.py
8
e
u
s
a
b
le

a
p
p
s
?
&,
-,
- La carpeLa /templates es buscada denLro de cada app.
- Convlene lnclulr una carpeLa con el nombre de la app por clarldad.
TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.load_template_source',
'django.template.loaders.app_directories.load_template_source',
)
return render_to_response('website/index.html')
AlLernauva reuullzable:
!"#$%&'"()*!+$
TEMPLATE_DIRS = (
'/home/django/templates',
)
semngs.py
8
e
u
s
a
b
le

a
p
p
s
?
&,
-,
- La carpeLa /templates es buscada denLro de cada app.
- Convlene lnclulr una carpeLa con el nombre de la app por clarldad.
TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.load_template_source',
'django.template.loaders.app_directories.load_template_source',
)
return render_to_response('website/index.html')
AlLernauva reuullzable:
51
Templates: {{}}
Residncia de Reuso - 2011.1 - Recife/PE
Sintaxe simples de templates
Desacoplado de Python
HTML com anabolizantes
Extensvel
Designers vo se apaixonar!
!"#$%&'"()*++,,
<html>
<head>Ejemplo templates</head>
<body>
Hola, {{ username }}.
</body>
</html>
{'username': 'juan'}
<html>
<head>Ejemplo templates</head>
<body>
Hola, juan.
</body>
</html>
Templates no podem
executar
cdigo Python!!!!
52
Templates: {{}}
Residncia de Reuso - 2011.1 - Recife/PE
!"#$%&'()(*+,'
Tags
53
Tags
Residncia de Reuso - 2011.1 - Recife/PE
!"#$%&'"()*'&+(*,-*-.
{% comment %} Bu! {% endcomment %}
/0##"1'
203
{% for elemento in lista %}
<li>{{ elemento }}<li>
{% endfor %}
42
{% if username == "Juan" %}
Hola Juan, me gustas!
{% else %}
Hola {{ username }},
{% endif %}
== != > < >= <=
in and or not
54
Filters
Residncia de Reuso - 2011.1 - Recife/PE
!"#$%&'"()*+,%'"-(
<html>
<head>Ejemplo templates</head>
<body>
Hola, {{ username|title }}.
</body>
</html>
{'username': 'juan'}
<html>
<head>Ejemplo templates</head>
<body>
Hola, Juan.
</body>
</html>
.'%"
55
Filters
Residncia de Reuso - 2011.1 - Recife/PE
!"#$%&'"()*+,%'"-(
{'value': 123456789}
{{ value|add:1 }}
&..
123456790
{{ value|filesizeformat }}
/%"(,0"12-#&'
117.7MB
{'date': datetime.datetime(2010, 9, 11, 17, 1, 59, 385323) }
{{ date|date:d M Y }}
.&'"
11 Sep 2010
{{ date|timesince }}
3#"(,45"
4 days, 6 hours
{{ date|timeuntil }}
3#"643%
1 days, 6 hours
56
Modelos
Residncia de Reuso - 2011.1 - Recife/PE
Ns temos objetos e queremos persist-los
Mapeamento entre Objetos e tabelas
Django tem ORM!
57
Eu crio classes e objetos
Residncia de Reuso - 2011.1 - Recife/PE
!"#$%"
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"
58
O ORM converte para SQL
Residncia de Reuso - 2011.1 - Recife/PE
!"#$%&'(&)$*+,
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;
59
Com 1 comando!
Residncia de Reuso - 2011.1 - Recife/PE
$ python manage.py syncdb
60
Congure o seu banco
Residncia de Reuso - 2011.1 - Recife/PE
!"#$%&'(')*+,#%*-./

DATABASE_ENGINE = 'sqlite3'
DATABASE_NAME = 'db.sqlite'
DATABASE_USER = ''
DATABASE_PASSWORD = ''
DATABASE_HOST = ''
DATABASE_PORT = ''
settings.py
61
e se alterar os modelos ?
Residncia de Reuso - 2011.1 - Recife/PE
No atualiza os esquemas existentes! :(
GoHorse: Dropa na mo e rexecuta syncdb!
south
desed
django-evolution
yasdel
Ou aplicaes externas:
62
Exemplo
Residncia de Reuso - 2011.1 - Recife/PE
!"#$%&
$ python manage.py syncdb
Creating table auth_permission
Creating table auth_group
Creating table auth_user
Creating table auth_message
Creating table django_content_type
Creating table django_session
Creating table django_site
Creating table website_tweet
You just installed Django's auth system, which means you don't have any
superusers defined.
Would you like to create one now? (yes/no): yes
Username (Leave blank to use 'neo'): admin
E-mail address: user@example.com
Password:
Password (again):
Superuser created successfully.
Installing index for auth.Permission model
Installing index for auth.Message model
Installing index for website.Tweet model
63
Exerccio 03
Residncia de Reuso - 2011.1 - Recife/PE
Criar o backend da sua app seminarios
Vamos usar o sqlite3
64
Exemplo
Residncia de Reuso - 2011.1 - Recife/PE
Hora de fazer montar consultas!
65
ORM- Consultas
Residncia de Reuso - 2011.1 - Recife/PE
$ python manage.py shell
select * from publisher;
!"#$%&'()*+,#,(-#*(./0
ts = Publisher.objects.all()
Model
Manager
QuerySet
66
ORM- Consultas
Residncia de Reuso - 2011.1 - Recife/PE
!"#$%&'())*+%,&-#))./
class Publisher(models.Model):
...

def __unicode__(self):
return self.name
>>> Publisher.objects.all()
[<Publisher: Publisher object>]
>>> Publisher.objects.all()
[<Publisher: Apress>]
67
ORM- Insero
Residncia de Reuso - 2011.1 - Recife/PE
!"#$%&
>>> p = Publisher(
... name='Apress',
... address='2855 Telegraph Avenue',
... city='Berkeley',
... state_province='CA',
... country='U.S.A.',
... website='http://www.apress.com/')
>>> p.save()
!"
o = Model(...) o.save()
68
ORM- Atualizao
Residncia de Reuso - 2011.1 - Recife/PE
!"#$%&
>>> ...
>>> p.id
52
>>> p.name = 'Apress Publishing'
>>> p.save()
o.save()
!
!"#$%&
>>> Publisher.objects.all().update(country='USA')
2
>>> ...
>>> p.id
52
>>> p.name = 'Apress Publishing'
>>> p.save()
o.save()
queryset.update(...)
!
"
69
ORM- Deleo
Residncia de Reuso - 2011.1 - Recife/PE
!"#"$"
>>> ps = Publisher.objects.all()
>>> ps.delete()
>>> ...
>>> p.id
52
>>> p.delete()
o.delete()
queryset.delete()
!
"
!"#"$"
>>> ps = Publisher.objects.all()
>>> ps.delete()
>>> ...
>>> p.id
52
>>> p.delete()
o.delete()
queryset.delete()
!
"
70
Select 1 resultado
Residncia de Reuso - 2011.1 - Recife/PE
!"#"$%&'(&)&*(+,-./'0
>>> Publisher.objects.get(name="Apress")
<Publisher: Apress>
.get(...)
>>> Publisher.objects.get(country="U.S.A.")
Traceback (most recent call last):
...
MultipleObjectsReturned: get() returned more than one Publisher --
it returned 2! Lookup parameters were {'country': 'U.S.A.'}
>>> Publisher.objects.get(name="Anaya")
Traceback (most recent call last):
...
DoesNotExist: Publisher matching query does not exist.
!"#"$%&'(&)&*(+,-./'0
>>> Publisher.objects.get(name="Apress")
<Publisher: Apress>
.get(...)
>>> Publisher.objects.get(country="U.S.A.")
Traceback (most recent call last):
...
MultipleObjectsReturned: get() returned more than one Publisher --
it returned 2! Lookup parameters were {'country': 'U.S.A.'}
>>> Publisher.objects.get(name="Anaya")
Traceback (most recent call last):
...
DoesNotExist: Publisher matching query does not exist.
!"#"$%&'(&)&*(+,-./'0
>>> Publisher.objects.get(name="Apress")
<Publisher: Apress>
.get(...)
>>> Publisher.objects.get(country="U.S.A.")
Traceback (most recent call last):
...
MultipleObjectsReturned: get() returned more than one Publisher --
it returned 2! Lookup parameters were {'country': 'U.S.A.'}
>>> Publisher.objects.get(name="Anaya")
Traceback (most recent call last):
...
DoesNotExist: Publisher matching query does not exist.
71
Select n resultados
Residncia de Reuso - 2011.1 - Recife/PE
!"#"$%&'(&)&*(+,-./'0+
>>> Publisher.objects.all()
[<Publisher: Apress>, <Publisher: O'Reilly>]
.all()
>>> Publisher.objects.filter(
country="U.S.A.", state_province="CA")
[<Publisher: Apress>]
.filter(...)
!"#"$%&'(&)&*(+,-./'0+
>>> Publisher.objects.all()
[<Publisher: Apress>, <Publisher: O'Reilly>]
.all()
>>> Publisher.objects.filter(
country="U.S.A.", state_province="CA")
[<Publisher: Apress>]
.filter(...)
!"#"$%&'(&)&*(+,-./'0+
>>> Publisher.objects.all()
[<Publisher: Apress>, <Publisher: O'Reilly>]
.all()
>>> Publisher.objects.filter(
country="U.S.A.", state_province="CA")
[<Publisher: Apress>]
.filter(...)
RETORNAM QUERYSETS e no LISTAS!
72
Manipulao de consultas
Residncia de Reuso - 2011.1 - Recife/PE
!"#$%&'()#"*$%'+'",-)./"$%
Modelo.objects.filter(campo1="valor1", campo2="valor2")
!"#$%&'()*+'"#$%,*-*.$/.-/0&'$),01"$)(#$2,*$/3,&4-&-$567
campo__exact=''
campo__iexact=''
campo__contains=''
campo__icontains=''
campo__isnull=T|F
campo__day=31
campo__gt=0
campo__gte=0
campo__lt=0
campo__lte=0
campo__in=[ ,]
campo__month=12
campo__startswith=''
campo__istartswith=''
campo__endswith=''
campo__iendswith=''
campo__range=( ,)
campo__year=2010
!"#$%&'()#"*$%'+'",-)./"$%
Modelo.objects.filter(campo1="valor1", campo2="valor2")
!"#$%&'()*+'"#$%,*-*.$/.-/0&'$),01"$)(#$2,*$/3,&4-&-$567
campo__exact=''
campo__iexact=''
campo__contains=''
campo__icontains=''
campo__isnull=T|F
campo__day=31
campo__gt=0
campo__gte=0
campo__lt=0
campo__lte=0
campo__in=[ ,]
campo__month=12
campo__startswith=''
campo__istartswith=''
campo__endswith=''
campo__iendswith=''
campo__range=( ,)
campo__year=2010
73
Order By
Residncia de Reuso - 2011.1 - Recife/PE
!"#$"%&'
>>> Publisher.objects.order_by("name")
[<Publisher: Apress>, <Publisher: O'Reilly>]
.order_by(...)
>>> Publisher.objects.order_by("-name")
[<Publisher: O'Reilly>, <Publisher: Apress>]
>>> Publisher.objects.order_by("-name", "country")
[<Publisher: O'Reilly>, <Publisher: Apress>]
!"#$%#&'()*+%,'-
!"#$"%&'
>>> Publisher.objects.order_by("name")
[<Publisher: Apress>, <Publisher: O'Reilly>]
.order_by(...)
>>> Publisher.objects.order_by("-name")
[<Publisher: O'Reilly>, <Publisher: Apress>]
>>> Publisher.objects.order_by("-name", "country")
[<Publisher: O'Reilly>, <Publisher: Apress>]
!"#$%#&'()*+%,'-
74
Relacionamentos One-to-One
Residncia de Reuso - 2011.1 - Recife/PE
!"#$%"&'()*"+%,
OneToOneField
class Coche(models.Model):
motor = OneToOneField(Motor)
class Motor(models.Model):
...
>>> c.motor
<Motor: Motor object>
>>> m.coche
<Coche: Coche object>
!"#$%&'()$%(&*)&+,*)-.#/&0,(0,&*)(&./(1)/-.)(2
3+)-.)(&)&/%(%1+%( 3+)-.)(&)&-*$./0
4
4
1
1
!"#$%"&'()*"+%,
OneToOneField
class Coche(models.Model):
motor = OneToOneField(Motor)
class Motor(models.Model):
...
>>> c.motor
<Motor: Motor object>
>>> m.coche
<Coche: Coche object>
!"#$%&'()$%(&*)&+,*)-.#/&0,(0,&*)(&./(1)/-.)(2
3+)-.)(&)&/%(%1+%( 3+)-.)(&)&-*$./0
4
4
!"#$%"&'()*"+%,
OneToOneField
class Coche(models.Model):
motor = OneToOneField(Motor)
class Motor(models.Model):
...
>>> c.motor
<Motor: Motor object>
>>> m.coche
<Coche: Coche object>
!"#$%&'()$%(&*)&+,*)-.#/&0,(0,&*)(&./(1)/-.)(2
3+)-.)(&)&/%(%1+%( 3+)-.)(&)&-*$./0
4
4
!"#$%"&'()*"+%,
OneToOneField
class Coche(models.Model):
motor = OneToOneField(Motor)
class Motor(models.Model):
...
>>> c.motor
<Motor: Motor object>
>>> m.coche
<Coche: Coche object>
!"#$%&'()$%(&*)&+,*)-.#/&0,(0,&*)(&./(1)/-.)(2
3+)-.)(&)&/%(%1+%( 3+)-.)(&)&-*$./0
4
4
75
Relacionamentos One-to-Many
Residncia de Reuso - 2011.1 - Recife/PE
1
n
!"#$%"&'()*"+%,
ForeignKeyField
class Blog(models.Model):
...
class Post(models.Model):
blog = ForeignKeyField(Blog)
>>> p.blog
<Blog: Blog object>
>>> b.post_set.all()
[<Post: Post object>, ...]
!"#$%&'()$%(&*)&+,*)-.#/&0,(0,&*)(&./(1)/-.)(2
3+)-.)(&)&/%(%1+%( 3+)-.)(&)&-*$./0
4
/
!"#$%"&'()*"+%,
ForeignKeyField
class Blog(models.Model):
...
class Post(models.Model):
blog = ForeignKeyField(Blog)
>>> p.blog
<Blog: Blog object>
>>> b.post_set.all()
[<Post: Post object>, ...]
!"#$%&'()$%(&*)&+,*)-.#/&0,(0,&*)(&./(1)/-.)(2
3+)-.)(&)&/%(%1+%( 3+)-.)(&)&-*$./0
4
/
!"#$%"&'()*"+%,
ForeignKeyField
class Blog(models.Model):
...
class Post(models.Model):
blog = ForeignKeyField(Blog)
>>> p.blog
<Blog: Blog object>
>>> b.post_set.all()
[<Post: Post object>, ...]
!"#$%&'()$%(&*)&+,*)-.#/&0,(0,&*)(&./(1)/-.)(2
3+)-.)(&)&/%(%1+%( 3+)-.)(&)&-*$./0
4
/
!"#$%"&'()*"+%,
ForeignKeyField
class Blog(models.Model):
...
class Post(models.Model):
blog = ForeignKeyField(Blog)
>>> p.blog
<Blog: Blog object>
>>> b.post_set.all()
[<Post: Post object>, ...]
!"#$%&'()$%(&*)&+,*)-.#/&0,(0,&*)(&./(1)/-.)(2
3+)-.)(&)&/%(%1+%( 3+)-.)(&)&-*$./0
4
/
76
Relacionamentos Many-to-Many
Residncia de Reuso - 2011.1 - Recife/PE
m
n
!"#$%"&'()*"+%,
ManyToManyField
class Post(models.Model):
tags = ManyToManyField(Tag)
class Tag(models.Model):
...
>>> p.tags.add(t1, t2)
>>> p.tags.all()
[<Tag: Tag object>, ...]
>>> t.post_set.add(p1, p2)
>>> t.post_set.all()
[<Post: Post object>, ...]
!"#$%&'()$%(&*)&+,*)-.#/&0,(0,&*)(&./(1)/-.)(2
3+)-.)(&)&/%(%1+%( 3+)-.)(&)&-*$./0
/
$
!"#$%"&'()*"+%,
ManyToManyField
class Post(models.Model):
tags = ManyToManyField(Tag)
class Tag(models.Model):
...
>>> p.tags.add(t1, t2)
>>> p.tags.all()
[<Tag: Tag object>, ...]
>>> t.post_set.add(p1, p2)
>>> t.post_set.all()
[<Post: Post object>, ...]
!"#$%&'()$%(&*)&+,*)-.#/&0,(0,&*)(&./(1)/-.)(2
3+)-.)(&)&/%(%1+%( 3+)-.)(&)&-*$./0
/
$
!"#$%"&'()*"+%,
ManyToManyField
class Post(models.Model):
tags = ManyToManyField(Tag)
class Tag(models.Model):
...
>>> p.tags.add(t1, t2)
>>> p.tags.all()
[<Tag: Tag object>, ...]
>>> t.post_set.add(p1, p2)
>>> t.post_set.all()
[<Post: Post object>, ...]
!"#$%&'()$%(&*)&+,*)-.#/&0,(0,&*)(&./(1)/-.)(2
3+)-.)(&)&/%(%1+%( 3+)-.)(&)&-*$./0
/
$
!"#$%"&'()*"+%,
ManyToManyField
class Post(models.Model):
tags = ManyToManyField(Tag)
class Tag(models.Model):
...
>>> p.tags.add(t1, t2)
>>> p.tags.all()
[<Tag: Tag object>, ...]
>>> t.post_set.add(p1, p2)
>>> t.post_set.all()
[<Post: Post object>, ...]
!"#$%&'()$%(&*)&+,*)-.#/&0,(0,&*)(&./(1)/-.)(2
3+)-.)(&)&/%(%1+%( 3+)-.)(&)&-*$./0
/
$
77
Ponteiros inversos
Residncia de Reuso - 2011.1 - Recife/PE
1
n
!"#$%"&'()*"+%,
!"#$%&'(#)**'(#+%&),%(#-"./0)-$-#)*#+-"$).%#/"0).(%
class Blog(models.Model):
...
class Post(models.Model):
blog = ForeignKeyField(Blog, related_name='posts')
>>> p.blog
<Blog: Blog object>
>>> b.posts.all()
[<Post: Post object>, ...]
!"#$%#&'#'()&)*")& !"#$%#&'#'1*$.2/
+
(
1-'"&%#2'3'#3'-"#$+4/.",'".%-"'3'0/&"#/,4#().5#/)#42$%/-4/
!"#$%"&'()*"+%,
!"#$%&'(#)**'(#+%&),%(#-"./0)-$-#)*#+-"$).%#/"0).(%
class Blog(models.Model):
...
class Post(models.Model):
blog = ForeignKeyField(Blog, related_name='posts')
>>> p.blog
<Blog: Blog object>
>>> b.posts.all()
[<Post: Post object>, ...]
!"#$%#&'#'()&)*")& !"#$%#&'#'1*$.2/
+
(
1-'"&%#2'3'#3'-"#$+4/.",'".%-"'3'0/&"#/,4#().5#/)#42$%/-4/
!"#$%"&'()*"+%,
!"#$%&'(#)**'(#+%&),%(#-"./0)-$-#)*#+-"$).%#/"0).(%
class Blog(models.Model):
...
class Post(models.Model):
blog = ForeignKeyField(Blog, related_name='posts')
>>> p.blog
<Blog: Blog object>
>>> b.posts.all()
[<Post: Post object>, ...]
!"#$%#&'#'()&)*")& !"#$%#&'#'1*$.2/
+
(
1-'"&%#2'3'#3'-"#$+4/.",'".%-"'3'0/&"#/,4#().5#/)#42$%/-4/
!"#$%"&'()*"+%,
!"#$%&'(#)**'(#+%&),%(#-"./0)-$-#)*#+-"$).%#/"0).(%
class Blog(models.Model):
...
class Post(models.Model):
blog = ForeignKeyField(Blog, related_name='posts')
>>> p.blog
<Blog: Blog object>
>>> b.posts.all()
[<Post: Post object>, ...]
!"#$%#&'#'()&)*")& !"#$%#&'#'1*$.2/
+
(
1-'"&%#2'3'#3'-"#$+4/.",'".%-"'3'0/&"#/,4#().5#/)#42$%/-4/
78
Laziness
Residncia de Reuso - 2011.1 - Recife/PE
Otimizao!! Consulta s realizada quando necessrio!
!"#$%&''
-
Las consulLas '()* se e[ecuLarn cuando realmenLe se
neceslLe obLener los ob[eLos. Ln las slgulenLes slLuaclones:
-
lLeraclones
-
Sllclng
-
Serlallzacln

repr()

len() !!!

list()

bool()
for p in Publisher.objects.all():
Publisher.objects.filter(country='USA')[0]
[Cache]
[<Publisher: Publisher object>]
len(Publisher.objects.all())
list(Publisher.objects.all())
if Publisher.objects.filter(country='USA'):
!"#$%&''
-
Las consulLas '()* se e[ecuLarn cuando realmenLe se
neceslLe obLener los ob[eLos. Ln las slgulenLes slLuaclones:
-
lLeraclones
-
Sllclng
-
Serlallzacln

repr()

len() !!!

list()

bool()
for p in Publisher.objects.all():
Publisher.objects.filter(country='USA')[0]
[Cache]
[<Publisher: Publisher object>]
len(Publisher.objects.all())
list(Publisher.objects.all())
if Publisher.objects.filter(country='USA'):
79
Exerccio 04
Residncia de Reuso - 2011.1 - Recife/PE
!"#$%&!'()*(+&"(*',(-(+&#./)*(&0&$(1(*(
80
Interface Administrativa
Residncia de Reuso - 2011.1 - Recife/PE
81
Interface Administrativa
Residncia de Reuso - 2011.1 - Recife/PE
82
djang.contrib.admin
Residncia de Reuso - 2011.1 - Recife/PE
Instalao 1/3
83
djang.contrib.admin
Residncia de Reuso - 2011.1 - Recife/PE
Instalao 2/3
!"#$%&'#()*$+',$-.#/#0*1$
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.admin',
...
)
!"#$%!&'(
1
84
djang.contrib.admin
Residncia de Reuso - 2011.1 - Recife/PE
Instalao 3/3
!"#$%&'(%)*+,&%,-.
$ python manage.py syncdb
Creating table django_admin_log
Installing index for admin.LogEntry model
!"#$%&'$()*&+*,*&-(*,
!"#$%&'(%)*+,&%,-.
$ python manage.py syncdb
Creating table django_admin_log
Installing index for admin.LogEntry model
!"#$%&'$()*&+*,*&-(*,
Acesse http://localhost:8000/admin
85
Opa! Falta registrar os modelos
Residncia de Reuso - 2011.1 - Recife/PE
Criar o mdulo admin.py
!"#$%&'(
!
"#$#%!''%$&'&%$&%(&)&*%&+%,-./0
!
1&2)&%3-4%5/$&+/,%,&*6)%78,8'+&,%$&,$&%&+%#$58)%.%
9&*58(&%9&*,/)#+8:#*%,-%#,9&;(/0
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)
Cada app deve ter o seu, pode ser congurvel!
86
Exerccio 04
Residncia de Reuso - 2011.1 - Recife/PE
!"#$%&'#(")
87
Forms
Residncia de Reuso - 2011.1 - Recife/PE
3 componentes
Widget
Componente Visual
Field
Campo Lgico
Form
!"#$%$&'()*"+,-#.#$
Widget !"#$"%&%'&()'$+#"(&)*+,-.&%'&(-(/012
TextInput
CheckboxInput
<input type='text'...>
<input type='checkbox'...>
Field /01',#(3&(*%(4-#$"5(-6"4+-3"(-(*%(7+38&'
EmailField
IPAddressField
widget, initial, error, ...
Form
!*(2+(3*(3&(9+&.36(3&(*%(:";#*.-;+"
ContactForm [nombre, email, telefono, mensaje, ...]
!"#$%$&'()*"+,-#.#$
Widget !"#$"%&%'&()'$+#"(&)*+,-.&%'&(-(/012
TextInput
CheckboxInput
<input type='text'...>
<input type='checkbox'...>
Field /01',#(3&(*%(4-#$"5(-6"4+-3"(-(*%(7+38&'
EmailField
IPAddressField
widget, initial, error, ...
Form
!*(2+(3*(3&(9+&.36(3&(*%(:";#*.-;+"
ContactForm [nombre, email, telefono, mensaje, ...]
!"#$%$&'()*"+,-#.#$
Widget !"#$"%&%'&()'$+#"(&)*+,-.&%'&(-(/012
TextInput
CheckboxInput
<input type='text'...>
<input type='checkbox'...>
Field /01',#(3&(*%(4-#$"5(-6"4+-3"(-(*%(7+38&'
EmailField
IPAddressField
widget, initial, error, ...
Form
!*(2+(3*(3&(9+&.36(3&(*%(:";#*.-;+"
ContactForm [nombre, email, telefono, mensaje, ...]
Formulrio em si
88
Criao de Formulrio
Residncia de Reuso - 2011.1 - Recife/PE
Passo 1: Denio de um formulrio forms.py
http://docs.djangoproject.com/en/dev/ref/forms/elds/
89
Criao de Formulrio
Residncia de Reuso - 2011.1 - Recife/PE
Passo 2: Denio do template do Formulrio
contato.html
90
Criao de Formulrio
Residncia de Reuso - 2011.1 - Recife/PE
Passo 3: Denio da view do Formulrio
91
Criao de Formulrio
Residncia de Reuso - 2011.1 - Recife/PE
Forms tem validao prpria! Cool :D
!"#$%"&$'()*+,*$"
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
!"#$%"&'()"*)+%+)',+-.#+/.01'$23)+'+&"/.+#+'+'/+#+'4.$-#'
#$-'5")%6-+)."'$&/).7.$1#"'61'%83"#"'clean_<fieldname>9
92
Forms a partir de Models
Residncia de Reuso - 2011.1 - Recife/PE
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

class AuthorForm(forms.ModelForm):
class Meta:
model = Author
exclude = ('country',)
!"#$%&'()
."#$%/(0
93
Exerccio 04
Residncia de Reuso - 2011.1 - Recife/PE
!"#$"%"&"'(")"
Alguns truques agora...
94
Django Avanado
Residncia de Reuso - 2011.1 - Recife/PE
1. Middleware
2. Caching
3. Deploying
4. Apps Recomendadas
95
Django Avanado
Residncia de Reuso - 2011.1 - Recife/PE
1. Middleware
2. Caching
3. Deploying
4. Apps Recomendadas
96
Middleware
Residncia de Reuso - 2011.1 - Recife/PE
Permite incrementar a funcionalidade injetando uxo de
execuo em Django
!"##$%&'(%
!"#$%&'()*&$&#+'),)'$-./+)"/01)202$'&.31)40,1&$
5.&$#&$)/#&'*0$&/$&1$6.7"$2&$&7&+.+)8/$2&$970/:"
97
Middleware
Residncia de Reuso - 2011.1 - Recife/PE
!"##$%&'(%
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."""
# ...
98
Middleware
Residncia de Reuso - 2011.1 - Recife/PE
!"##$%&'(%
!"#"$%&'()"'*#+,)*-'#)"&.-%'$*//,"01-"'"#'",',)21-'
()"'#%&'+%#3"#214')%*"%*#+,%*,-.%*)',%$,+(#%*,#%,
%/%-.-"0*,%*,$',1%2.%3),4,%*,$',1%35+*3%5
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
)
Registrar o middlewares no settings.py
99
Django Avanado
Residncia de Reuso - 2011.1 - Recife/PE
1. Middleware
2. Caching
3. Deploying
4. Apps Recomendadas
100
Caching
Residncia de Reuso - 2011.1 - Recife/PE
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!'
!
"#$%&#'()*)+%*,()-*./-0%,(12#($%(#34%5#(/-%('%(2-%$*('%,0*.06*,7
!
(8-%,9:%5'
!
(;0'5*'
!
(777
101
Django Avanado
Residncia de Reuso - 2011.1 - Recife/PE
1. Middleware
2. Caching
3. Deploying
4. Apps Recomendadas
102
Deploying
Residncia de Reuso - 2011.1 - Recife/PE
Por o sistema em produo
VirtualEnv + PIP + Fabric
103
Virtualenv
Residncia de Reuso - 2011.1 - Recife/PE
Projeto independente do sistema
Ou seja cada projeto com suas dependncias
especcas
!"#$%&'()*
!
"#$%&%#$%#'()*'+,&-%.)*$%*-)/*-(01%12)/*$%-*/(.%,)3
!
4)$)*&1+5%'.+*6%#%*/7*87%9+*$%*-(01%12)/*%#*-)*:%1/(;#*<7%*#%'%/(.)
!
=(#*,(%$+*)*)'.7)-(>)1
!
=(#*,(%$+*)*,(91)1
!
%.'333
$ virtualenv --no-site-packages mi_entorno
+#(&#
Adeus dor de cabea de migrar, atualizar, etc.
!"#$%&'()*
!
"#$%&%#$%#'()*'+,&-%.)*$%*-)/*-(01%12)/*$%-*/(.%,)3
!
4)$)*&1+5%'.+*6%#%*/7*87%9+*$%*-(01%12)/*%#*-)*:%1/(;#*<7%*#%'%/(.)
!
=(#*,(%$+*)*)'.7)-(>)1
!
=(#*,(%$+*)*,(91)1
!
%.'333
$ virtualenv --no-site-packages mi_entorno
+#(&#
$ source mi_entorno/bin/activate
&+,*&#
104
Pip
Residncia de Reuso - 2011.1 - Recife/PE
Gerenciador de Pacotes
Voc pode criar uma lista de requisitos (requirements)
para instalao automtica! :D
!"!
-
CesLor de paqueLes del slglo 21 :u
-
ermlLe especlcar un chero de 8LCul8LMLn1S con un llsLado de
paqueLes a lnsLalar.
u[ango==1.2.1
psycopg2
feedparser==4.1
sLrlpogram==1.3
CCharLWrapper==0.8
pip install -E mi_entorno -r REQUIREMENTS
!"!
-
CesLor de paqueLes del slglo 21 :u
-
ermlLe especlcar un chero de 8LCul8LMLn1S con un llsLado de
paqueLes a lnsLalar.
u[ango==1.2.1
psycopg2
feedparser==4.1
sLrlpogram==1.3
CCharLWrapper==0.8
pip install -E mi_entorno -r REQUIREMENTS
105
Fabric
Residncia de Reuso - 2011.1 - Recife/PE
Repetition leads to boredom, boredom to horrifying mistakes,
horrifying mistakes to God-I-wish-I-was-still-bored
!"#$%&
env.user = "example"
env.hosts = ["example.com"]
def deploy():
run('svn up /home/example/')
sudo('/etc/init.d/lighttpd restart')
'"#()*+,-
Repetition leads to boredom, boredom to horrifying mistakes,
horrifying mistakes to God-I-wish-I-was-still-bored

!"#$%&
env.user = "example"
env.hosts = ["example.com"]
def deploy():
run('svn up /home/example/')
sudo('/etc/init.d/lighttpd restart')
'"#()*+,-
fabric deploy
./0
Repetition leads to boredom, boredom to horrifying mistakes,
horrifying mistakes to God-I-wish-I-was-still-bored

106
Django Avanado
Residncia de Reuso - 2011.1 - Recife/PE
1. Middleware
2. Caching
3. Deploying
4. Apps Recomendadas
107
django-registration
Residncia de Reuso - 2011.1 - Recife/PE
Sistema completo de cadastro de usurios
DRY!!
Instalao Copy and Paste
!"#$%&'()%*+,(#-&$
hup://blLbuckeL.org/ubernosLrum/d[ango-reglsLrauon/
/acuvaLe/compleLe/
/acuvaLe/<acuvauon_key>/
/ reglsLer/
/ reglsLer/compleLe/
/ reglsLer/closed/
/ logln/
/ logouL/
/ password/change/
/ password/change/done/
/ password/reseL/
/ password/reseL/conrm/<Loken>
/ password/reseL/compleLe/
/ password/reseL/done/
/ reacuvaLe/
108
django-socialregistration
Residncia de Reuso - 2011.1 - Recife/PE
O django-registration s que anabolizado!
Autenticao com Twitter, Facebook, oAuth, openID
Integrao perfeita com django.contrib.auth
!"#$%&'(&)*#+,-%*(.,#/&$
hup://glLhub.com/ashlngpumpkln/d[ango-soclalreglsLrauon
-
Conguracln sencllla
-
AuLenucacln con:
-
Lwluer, facebook, oauLh, openld
-
lnLegracln perfecLa con conLrlb.auLh
109
django-piston
Residncia de Reuso - 2011.1 - Recife/PE
Framework Django para construo de servios RESTful
Fcil de instalar
!"#$%&'()*+&$
hup://blLbuckeL.org/[espern/d[ango-plsLon/wlkl/Pome
- lramework para crear Als 8LS1ful
- Muy fcll lnsLalacln
- Serlallzacln a:
-!SCn, ?AML, yLhon yckle, xML ...
-CAuLh
-8ecomendado +++++
Suporte para YAML, JSON, XML, etc.
OAuth
!"#$%&'()*+&$
hup://blLbuckeL.org/[espern/d[ango-plsLon/wlkl/Pome
-
lramework para crear Als 8LS1ful
-
Muy fcll lnsLalacln
-
Serlallzacln a:
-
!SCn, ?AML, yLhon yckle, xML ...
-
CAuLh
-
8ecomendado +++++
110
Residncia de Reuso - 2011.1 - Recife/PE
!"#$%&'"#()*#+,)-)./
Apenas uma ponta do iceberg
111
Lembre-se da comunidade!
Residncia de Reuso - 2011.1 - Recife/PE
http://python.org.br
http://djangobrasil.org
http://pug-pe.python.org.br
#django-br
#python-br
112
Trabalho da Semana
Residncia de Reuso - 2011.1 - Recife/PE
Trabalho para 5 pessoas
Criar um sistema em Django com o assunto visto at aqui
O sistema deve ter no mnimo 10 entidades
O sistema deve ter controle de acesso
(ver django-registration)
Modelagem vocs decidem
Apresentar pontos positivos e negativos durante o uso da
tecnologia
113
Referncias e Crditos
Residncia de Reuso - 2011.1 - Recife/PE
Desenvolvimento web com Python e Django
http://www.slideshare.net/igorsobreira/desenvolvimento-web-com-python-e-django
Django: Disfruta Programando
http://www.slideshare.net/etox/django-eghost-2010
Tutoriais DjangoBrasil
http://docs.djangobrasil.org/intro/tutorial01.html
114
Bibliograa
Residncia de Reuso - 2011.1 - Recife/PE
The Definitive Guide to Django: Web Development Done Right. Adrian
Holovaty, Jacob K. Ed. Appress ISBN-13: 978-1430219361
Pro Django (1st ed.) Marty Alchin. 2008. . Apress, Berkely, CA, USA. ISBN -
1430210478
Python e Django - Desenvolvimento gil de Aplicaes Web - Osvaldo
Santana Neto e Thiago Galesi; Editora Novatec ISBN. 9788575222478.
115
Apresentando
Marcel P. Caraciolo
caraciol@gmail.com
Residncia RISE - 2011
116
Exerccio 01
Residncia de Reuso - 2011.1 - Recife/PE
Vamos construir um mini-sistema de submisso
de palestras do nosso seminrio
1. Criar um projeto seminario
2. Criar uma app trabalhos
3. Criar uma view index redirecionando para
uma pgina html de boas vindas usando
templates.
117
Exerccio 05
Residncia de Reuso - 2011.1 - Recife/PE
Vamos criar a nossa interface administrativa para o nossos
modelos recm-criados
118
Exerccio 04
Residncia de Reuso - 2011.1 - Recife/PE
Vamos criar os modelos para Trabalho e Palestrante
Trabalho
usuario: User
titulo: String
descricao: String
slides: File
status: Integer
name
Palestrante
*
1. *
119
Exerccio 02
Residncia de Reuso - 2011.1 - Recife/PE
Vamos criar 2 novos templates
1.trabalhos.html
2. detalhes.html
120
Exerccio 06
Residncia de Reuso - 2011.1 - Recife/PE
Vamos construir um formulrio simples de submisso de palestras!
121

Potrebbero piacerti anche