Vous êtes sur la page 1sur 235

Aprendendo Django no

Planeta Terra - vol. 1


Marinho Brando
1 edio - 2009
Copyright 2008 por Jos Mrio Neiva Brado
reviso
My!he"" Neiva #odrig$es
ilustraes e capa
Joo Mathe$s Ma%%ia de &"iveira
impresso e acabamento
'$"$(!o)
*odos os direitos reservados por
Jos Mrio Neiva Brado
+-)ai", )ariho-aprededod.ago(!o)
///(aprededod.ago(!o)
Licena
+sta o0ra e se$s persoages so "i!e!iados so0 a "i!ea Creative Commons
Atri!io-"so #o-Comercial-$edada a Criao de %ras Derivadas &.'
Brasil 1 http,22!reative!o))os(org2"i!eses20y-!-d22(320r2 4(
5s pre)issas 0si!as desta "i!ea so 6$e,
$oc( pode
!opiar7 distri0$ir7 e8i0ir e e8e!$tar a o0ra
)o as seg!intes condi*es
5tri0$io( 9o!: deve dar !rdito ao a$tor origia"7 da ;or)a
espe!i;i!ada pe"o a$tor o$ "i!e!iate(
<so No-Co)er!ia"( 9o!: o pode $ti"i%ar esta o0ra !o) ;ia"idades
!o)er!iais(
9edada a Criao de &0ras =erivadas( 9o!: o pode a"terar7
tras;or)ar o$ !riar o$tra o0ra !o) 0ase esta(
%serva*es
>ara !ada ovo $so o$ distri0$io7 vo!: deve dei8ar !"aro para o$tros
os ter)os da "i!ea desta o0ra(
?$a"6$er $)a destas !odi@es pode) ser re$!iadas7 desde 6$e 9o!:
o0teha per)isso do a$tor(
Nada esta "i!ea atrapa"ha o$ restrige os direitos )orais do a$tor(
& a$tor desta o0ra e de se$s persoages +os, M-rio #eiva Brando
1!odio)e .Marinho Brando.4(
5 a$toria das i"$stra@es de +oo Mathe!s Ma//ia de %liveira(
5 reviso e edio do te8to de M0chell #eiva 1odrig!es(
)!m-rio
Volume 1
5grade!i)etos(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((A
=i!as para o apredi%ado(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((B
5presetao(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((9
1( 5"ata%a !hega ao >"aeta *erra ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((11
2( & 6$e =.agoC Co)o issoC (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((1D
D( Bai8ado e Esta"ado o =.ago (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((1A
F( Criado $) B"og )aeiro (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((2D
3( +tededo !o)o o =.ago tra0a"ha ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((D9
A( & #GG o etregador ;ie" (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((F3
B( Ha%edo a apresetao do site !o) te)p"ates (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((AF
8( *ra0a"hado !o) ar6$ivos estti!os (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((82
9( >gias de !oteIdo so H"at>ages (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((9F
10( >er)itido !otato do o$tro "ado do <iverso ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((101
11( =ei8ado os !o)etrios ;"$Jre) ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((11B
12( <) po$!o de K*M' e CGG sL ;a% 0e) ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((1D0
1D( <) po$!o de >ytho agora (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((131
1F( 5.$stado as !oisas para !o"o!ar o ar ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((1A8
13( E;iitas ;or)as de se ;a%er dep"oy((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((1B3
1A( >reparado $) servidor !o) Mido/s (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((183
1B( >reparado $) servidor !o) 'i$8 ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((203
18( MGNE e Gervidores !o)parti"hados ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((22F
$ol!me &
=i!as para o apredi%ado
19( Giga"s e <#'s a)igveis !o) G"$gs
20( <)a ga"eria de i)ages si)p"es e Iti"
21( &rgai%ado as !oisas !o) *ags
22( & )es)o site e) vrios idio)as
2D( Ha%edo $) siste)a de Cotas >essoais
2F( Ha%edo )ais !oisas a ap"i!ao de Cotas >essoais
23( 5 ap"i!ao de Cotas >essoais sai do 0a!Ostage
2A( Geparado as !otas pessoais para $s$rios
2B( H$@es de $s$rios
28( >rogra)ado !o) testes a$to)ati%ados
29( Criado ;erra)etas para a "iha de !o)ado
D0( 5detrado a se"va e !ohe!edo os verdadeiros 0i!hos
$ol!me 1
3
Agradecimentos
K diversas pessoas a agrade!er7 )as os o)es )ais ;ortes 6$e teho pra !itar
so estes,
Me%iha e >ai%iho
'etJ!ia e *arsi"a
Mi"tiho e 9eriha
My!he"" e Joo Mathe$s
5dre/s Media7 N$i"her)e Ge)ete e Betty 9oge"
=o$g"as 5da)s7 He"ippe e =oa"dso Nardi
&s desevo"vedores do =.ago e do >ytho
'i$s *orva"ds e #i!hard Gta"")a
5s pessoas a!i)a ;ora) de!isivas para 6$e esta o0ra se torasse rea"( *odo
agrade!i)eto e dedi!atLria so po$!os diate do 6$e re!e0i de"es(
A
Dicas de Aprendi/ado
5tes de etrar de !a0ea a "eit$ra do "ivro7 0o) )ater e) )ete a"g$s
pri!Jpios 6$e vo ;a!i"itar a !o)preeso7 )ater a !a")a e) a"g$s )o)etos e
;orta"e!er o apredi%ado(
9e.a a0ai8o,
#o copie e cole2 digite
5 pior !oisa a ;a%er para se apreder a"go 0$s!ar o ata"ho de !opiar e !o"ar7
!o) a6$e"a ve"ha a$to-i"$so Pahh7 . etedi isso7 vo$ !opiar e !o"ar sL pra
!o;ir)ar 6$e e$ etediP(
Esso o cola - o$ pe"o )eos o !o"a a s$a )e)Lria( =igite !ada !o)ado7
!ada "iha7 !ada !oisiha7 ;aa por vo!: )es)o7 e os res$"tados sero )ais sL"idos
e d$rado$ros(
Calma2 !ma coisa de cada ve/
& deta"ha)eto ii!ia" ;eito assi) por s$a prLpria at$re%a( Q )edida 6$e
a"g$)as !oisas so e8p"i!adas deta"hada)ete7 e"as passa) a ser apotadas de
;or)a )ais o0.etiva da"i e) diate7 e !oisas e) ;o!o a6$e"e !apJt$"o passa) a ser
)ais deta"hadas(
5ssi)7 se vo!: !oti$a pesado 6$e o "ivro est deta"hado de)ais7 $)
0o) sia" de 6$e aprede$ as "i@es dos !apJt$"os ateriores de ta" ;or)a 6$e e)
oto$( >ara0sR
#o e3iste m-gica2 no se il!da com isso
& =.ago o $)a ;erra)eta )gi!a( M$ito )eos de tr$6$es(
5 prod$tividade do =.ago est "igada a tr:s !oisas )$ito i)portates,
4rame5or6. *ra0a"har !o) $) ;ra)e/orO )ais prod$tivo
si)p"es)ete por6$e vo!: o ;a% !oisas 6$e . esto protas e "evara)
B
aos para sere) !riadas de ;or)a 6$e vo!: possa $sar ;a!i")ete agora(
+sse va"or sL te) essa ;ora e diS)i!a por6$e o =.ago so7t5are livre(
Conhecimento. & se$ !ohe!i)eto do =.ago e de !o!eitos
apro;$dados de 8e7 Programao %rientada a %jetos e Bancos de
Dados ;a% *&=5 a di;erea(
P0thon. T $)a "ig$age) de ;!i" !o)preeso7 o 0$ro!rti!a e
prti!a( M$ito prti!a( Esso evita 6$e se$ !re0ro se per!a e) iterpretar
!oisas e sJ)0o"os 6$e o pre!isaria iterpretar e )ateha o ;o!o a
so"$o(
>ortato7 o e8iste) ata"hos7 e) vida ;!i"7 )as vo!: pode ;a!i"itar as !oisas
e se divertir !o) isso7 $sado as ;erra)etas !ertas7 e agido !o) ;o!o e
persist:!ia( +to7 $)a 0e"a )ah vai per!e0er 6$e est prod$%ido !o)
6$a"idade e rapide%7 por se$s prLprios )ritos(
$erso do Django
5 verso do =.ago adotada esta srie a verso 1.9.&(
5"g$)as pessoas t:) e!otrado a"g$)as di;i!$"dades e) de!orr:!ia de
$sare) $)a verso di;erete( K di;ereas etre vers@es e) aspe!tos 6$e te)os
tra0a"hado7 portato7 $se a verso 1.9.& o! s!perior(
4i:!e ligado nas e3tens*es do ar:!ivos
No 8indo5s7 o padro o!$"tar as e8tes@es dos ar6$ivos( >or e8e)p"o, para
$) ar6$ivo .teste.t3t.7 ser e8i0ido apeas !o)o .teste.(
Esso tre)eda)ete !hato para o
desevo"vedor(
>ara ;a!i"itar a s$a vida7 v $)a
.ae"a do ;3plorer7 ao )e$
4erramentas -U %p*es de Pasta e
desa0i"ite a opo 6$e vo!: ve a
i)age) a0ai8o(
8
Apresentao
Ol,
nos ltimos anos, tenho investido a maior parte do
meu tempo com o Django.
Eu vinha de uma longa jornada onde segui
firmemente (e nem sempre fielmente ou alegremente)
com o Delphi e o PHP. as chegou uma hora !ue uma
nova tecnologia era necessria " j haviam se passado
!uase #$ anos%
& sa'da foi conhecer as linguagens de programa()o populares,
colocando alguns princ'pios em mente*
& tecnologia teria !ue ser multi-plataforma
& tecnologia teria de ser til para sites e sistemas web
Eu !ueria ter resultados
&p+s meses de namoro com ,ava e .-et, notei !ue a!uilo n)o era o !ue eu
precisava. Ent)o parti para conhecer outras... ./0, 1u23, Python... opa% -)o
precisei passar da!ui%
Do P3thon eu cheguei ao Django e ali fi!uei.
O Django 4 uma da!uelas coisas !ue voc5 j tem uma 2oa impress)o na
chegada, mas algumas semanas depois, voc5 est completamente apai6onado. Hoje,
!uase 7 anos depois, eu sinto amor pra vida inteira " ou pelo menos para a curta
vida !ue as tecnologias costumam levar.
H cerca de um ano atrs, estava para concluir a escrita de um livro
em portugu5s so2re Django, e perce2i !ue ele n)o era nada do !ue eu
!ueria.
Passei a 2orracha e resolvi esperar.
8
Ent)o depois de muitos meses e muitas conversas, perce2i !ue o
melhor caminho seria este.
Eu !uero !ue pessoas comuns aprendam Django, portanto, este 4 o livro
eletrnico !ue criei para essas pessoas comuns.
Pessoas comuns s)o pessoas !ue gostam de passear com a famlia, ouvir
msica, conhecer gente legal e ganhar dinheiro.
. certo !ue toda pessoa comum tem tam24m l suas es!uisitices... ent)o, o
nosso ator principal a!ui ser o um alien'gena.
Pronto, agora n)o temos mais pro2lemas com a es!uisitice%
#$
!aptulo "# Alata$an chega ao Planeta %erra
H poucas semanas, &lata9an estava numa nave de
transporte em massa vinda de &atara.
:atara (!ue significa 'n(s resolvemos' em seu
idioma mais popular) 4 um planeta n)o muito distante,
!ue gira em torno de um sol gelado e azul claro;. 0
e6iste a tradi()o de enviar seus jovens para outros
planetas, com o fim de passar um tempo ali aprendendo
seus costumes e dando um tempo para os pais !ue !uerem ter uma folga das manias
desses jovens.
&lata9an escolheu o Planeta .erra depois de consultar no <oogle =>3 e achar
2onitinha a forma rechonchuda, molhada e !uentinha da .erra. E assim, veio parar
a!ui atrav4s de uma coisa !ue parece um prato cheio de l?mpadas coloridas. =im,
eles conseguem acesso @ nossa internet, e voc5 sa2er em 2reve como fa9em isso.
&lgumas semanas depois de chegar @ .erra, &lata9an perce2eu !ue o nosso
pe!ueno planeta estava em polvorosa com a!uilo !ue chamvamos de
')ngenharia de *oftware'. Ele ainda n)o compreendeu como haveria uma
engenharia para uma coisa mole e sem forma, mas &lata9an 4 otimista, sempre. E
sa2e !ue vai resolver esse enigma.
Depois de resolver a !uest)o de sua relu9ente careca com uma peruca 2acana
(apesar do amarelo ser um tom de amarelo incomum para ca2elos), &lata9an
tam24m procurou resolver uma !uest)o menos importante mas muito chata* seus
documentos.
/om documentos !ue o fi9eram se tornar menos es!uisito aos olhos dos
terr!ueos, &lata9an conseguiu uma vaga em um curso da tal AEngenharia de
=oftBareA. 0ogo perce2eu !ue n)o havia engenheiro de softBare algum, na verdade
os profissionais da engenharia de softBare eram chamados de muitos nomes, como
AanalistasA, Aar!uitetosA, AprojetistasA, AdesenvolvedoresA, AcodificadoresA,
AhomologadoresA, AenroladoresA, enfim, eram muitos t'tulos, n)o muito claros, e
&lata9an ainda n)o entendia 2em para !u5 serviam tantos nomes para se reali9ar
atividades t)o parecidas.
##
-a sa'da da primeira aula, &lata9an estava um tanto atordoado com as confusas
defini(Ces !ue ouvira. &inda n)o entendia como &r!uitetura e Engenharia serviam
para definir !uase as mesmas coisas de um assunto, e tam24m n)o entendia pra !u5
serviam todos a!ueles desenhos, !ue precisam ser refeitos todos os dias e repetidos
em c+digos e outras formas de repeti(Ces... Doi !uando ele notou !ue uma garota e
um rapa9 eram os nicos !ue desciam a rampa, !ue pareciam se divertir.
&lata9an pensou* Apu6a, do !u5 esses dois es!uisitos est)o rindo depois de toda
essa torturaE Deve haver algo !ue eu preciso entender...A
&lata9an se achava no direito de achar os terr!ueos es!uisitos. Eram todos
diferentes dele, e ele tinha um alto padr)o de 2ele9a para :atara* um 2elo topete
(sim, isso tam24m ser e6plicado), olhos de desenho japon5s, e dois 2elos dedos em
cada p4%
E foi assim !ue &lata9an conheceu !artola e +ena, seus parceiros nessa
aventura.
#F
!aptulo ,# - .ue / Django0 !omo / isso0
.9999t%
& campainha da casa de !artola tocou, era &lata9an do lado de fora. Ele deu
uma olhadela pela vene9iana e correu para a2rir a porta.
Gem, estamos fa9endo um projeto l dentro, usando uma coisa nova, voc5 vai
gostar disso.
Para &lata9an todas as tecnologias terr!ueas eram novas, mas a alegria de
/artola j indicava !ue ela parecia ser um pouco diferente das apresentadas no
curso.
/orreram pra dentro e +ena estava sentada ao seu laptop com alguns ar!uivos
a2ertos e olhando o resultado de sua AarteA no navegador.
Geja, o /artola desco2riu esse novo jeito de fa9er sites. H uma tecnologia
chamada Django... d pra fa9er muitas coisas diferentes sem muito esfor(o. O
maior esfor(o 4 es!uecer um pouco do !ue sa2emos hoje pra entender o novo
paradigma.
1as enfim2 o .ue / o Django0
Django 4 um frameBor>, constru'do usando a linguagem P3thon.
3ramewor4 4 uma cai5a de ferramentas. as n)o 4 apenas isso, o Django 4
uma cai6a de ferramentas com um manual dentro, e as ferramentas combinam
muito bem umas com as outras. Goc5 usa as ferramentas !ue !uiser, e se voc5
!uiser su2stituir uma delas por outra, isso / perfeitamente possvel.
, o Python 4 uma linguagem de programa()o, trata"se de uma tecnologia !ue l5
o c+digo !ue voc5 escreveu numa sinta6e conhecida e d vida @!uilo.
as o P3thon tam24m n)o 4 s+ isso. Ele funciona em praticamente !ual!uer
computador, seja com o IindoBs, 0inu6 ou ac, 4 fcil de aprender e de entender.
=ua forma de tratar a programa()o 4 uma forma !ue fa$ sentido. Os caras !ue
criaram o P3thon n)o tinham a menor vontade de complicar as coisas.
#7
&l4m do Django e do P3thon, voc5 vai precisar de um 2anco de dados.
O Janco de Dados 4 onde os dados s)o guardados. Kuando voc5 est em uma
rodoviria ou aeroporto, e6iste o guarda"volumes, um local onde voc5 paga um
valor pra guardar suas coisas por um certo tempo. Kuando precisa guardar dinheiro,
voc5 vai ao 2anco. O Janco de Dados 4 o lugar certo para guardar dados, e ele 4
independente do Django.
Os 2ancos de dados !ue o Django conhece s)o o 1y*67, Postgre*67,
*67ite, -racle e icrosoft *67 *erver. as n+s vamos tra2alhar por um 2om
tempo s+ com o *67ite, !ue 4 o mais fcil deles.
E para ver o seu site ou programa funcionando, voc5 vai precisar de um
+avegador, !ue 4 o programa !ue voc5 usa para acessar sites da Be2. o9illa
3irefo5, icrosoft 8nternet )5plorer e &pple *afari s)o alguns deles. -+s vamos
usar o Direfo6 por ser o nico destes !ue funciona tanto no IindoBs, !uanto no
0inu6 e no ac. as n)o se preocupe com isso, o navegador 4 o !ue menos
importa !uando se trata de Django.
) como ele funciona0
Ent)o resumindo a hist+ria, o Django funciona assim*
#. voc5 tem um navegador, o Direfo6 por e6emploL
F. voc5 entra no navegador e digita o endere(o do seu siteL
7. o site 4 feito em Django, usando a linguagem P3thonL
M. atrav4s do Django, seu site acessa dados do Janco de Dados e em
ar!uivos locais e retorna para seu navegador uma 2ela pgina com
funcionalidades em geralL
N. voc5 olha sorridente para o navegador e v5 o resultado final.

&lata9an agora sa2e do !ue o Django se trata, e j se sentiu mais em casa. Em
#M
:atara, as coisas costumam ser mais simples do !ue t5m sido na .erra. Osso por!ue
o povo de l j passou por isso o suficiente pra desco2rir !ue simplificar as coisas
sempre ajuda no resultado final. O !ue eles n)o sa2em 4 !ue simplificar evita
ca2elos 2rancos, j !ue eles n)o possuem ca2elos.
-o pr+6imo cap'tulo, vamos 2ai6ar e instalar o Django, o P3thon e o !ue mais
for necessrio, e dar os primeiros passos para criar o primeiro projeto* um 2log, !ue
&lata9an vai usar para se comunicar com sua fam'lia.
#N
!aptulo 9# :ai5ando e 8nstalando o Django
Kuando &lata9an chegou @ .erra, sua pe!uena nave
foi enviada da nave maior, e ao chegar, chocou"se ao
ch)o, meio desajeitada, e pareceu acertar algu4m !ue
passeava com seu cachorrinho.
&lata9an saiu de dentro um pouco desajeitado e uma
velhinha lhe ofereceu um suco.
Ele adorou a!uilo, e agora, na casa de /artola, ele
tomava um suco de tangerina pra refrescar um pouco
antes de retomar @ desco2erta do Django.
Do nada, ele soltou essa*
Kuem inventou o sucoE
=ei l, algu4m !ue estava sentindo calor, h muito tempo atrs...
Kuem foi eu n)o sei, mas ainda 2em !ue ele contou a receita pra algu4m,
sen)o teria ido dessa pra melhor com sua ideia guardada e dei6ando um monte de
gente fadada ao cafe9inho.
& fruta 4 de pre(o 2ai6o, fcil de comprar, a receita 4 livre para !ual!uer um,
4 s+ ter um pou!uinho de tempo, gua, li!uidificador, a(car, essas coisas... 2om
demais% Gou levar isso pra :atara e vou ficar rico fa9endo sucos...
E depois dessas divaga(Ces, eles voltaram ao computador.
/omo 4 !ue se consegue o DjangoE " &lata9an j foi logo indagando ao
/artola...
!omo conseguir o Django
O Django 4 software livre. O P3thon tam24m 4 software livre.
*oftware livre 4 todo softBare !ue sua a receita 4 livre, p2lica, acess'vel para
!ual!uer um. H como se voc5 for a um restaurante e !uiser ver como 4 a co9inha
#P
pra ter certe9a de !ue n)o est)o lhe oferecendo gato por frango. H como se voc5
!uiser um dia fa9er diferente e misturar suco de lim)o com a2acate... parece
estranho, mas voc5 pode fa9er isso se !uiser (e 4 estranho !ue algumas pessoas
realmente gostem).
Os caras !ue fi9eram o Django acreditam !ue todo softBare (ou pelo menos a
maioria deles) deveria ser livre. Eles ganham dinheiro usando softBare livre, mas
n)o impedem !ue outras pessoas tam24m o usem e ganhem dinheiro da mesma
forma, ou at4 mais.
as se o softBare !ue voc5 fa9 ser livre ou n)o, isso tam24m 4 um direito seu.
Ent)o ficou fcil de resolver. Goc5 pode 2ai6ar o Django e n)o pagar nada por
isso. Qs"lo e n)o pagar nada por isso. E pode vender o seu tra2alho com ele, e n)o
repassar nada a eles por isso. =+ 4 preciso !ue escreva em algum lugar !ue seu
softBare foi escrito usando Django.
O mesmo vale para o P3thon e para as 2i2liotecas adicionais !ue o Django
utili9a.
:ai5ando e instalando
H vrias formas de se instalar o Django. &lgumas muito fceis, outras muito
educativas. -+s vamos seguir pelo caminho !ue deve ser o mais dif'cil deles. Osso 4
por!ue 4 importante passar por essas etapas para a2rir sua mente ao universo
P3thon e Django, mas caso !ueira o caminho mais prtico, v direto ao final deste
cap'tulo e veja como fa9er.
+o ;indows
Jom, ent)o vamos come(ar pelo Python.
=e voc5 usa IindoBs, fa(a o doBnload do instalador do P3thon, acessando a
seguinte Q10 no seu navegador*
http://www.python.org/download/releases/2.5.2/
&p+s 2ai6ar o ar!uivo, cli!ue duas ve9es so2re ele e cli!ue no 2ot)o '+e5t'.
#R

-a pr+6ima pgina, a imagem a2ai6o ser e6i2ida, guarde o caminho indicado
no campo (no caso da imagem a2ai6o, 4 '!#<Python,=<', pois vamos us"lo logo
ap+s a instala()o do P3thon. Depois dela, siga clicando no 2ot)o '+e5t' at4
finali9ar.
#S
Por fim, 4 importante fa9er isso* o IindoBs n)o consegue encontrar so9inho o
P3thon, portanto, 4 preciso di9er a ele onde o P3thon est. Osso se fa9 adicionando o
caminho de instala()o do P3thon @ varivel de am2iente PA%>, do IindoBs.
Pressione as teclas ;indows ? Pause (a tecla IindoBs 4 a tecla do logotipo do
IindoBs).
-a janela a2erta, cli!ue na a2a 'Avanado' e depois disso, no 2ot)o Variveis
de ambiente*
-a cai6a de sele()o '@ariAveis do *istema' cli!ue duas ve9es so2re o item
'Path'.

#8
E ao final do campo '@alor da @ariAvel', adicione um ponto"e"v'rgula e o
caminho !ue voc5 memori9ou da instala()o do P3thon, como est destacado a2ai6o.

Pronto% O P3thon est pronto para uso. &gora vamos ao Django%
-a pgina a seguir voc5 encontrar alguns meios para instalar o Django.
http://www.djangoproject.com/download/
Gamos instalar o tarball da vers)o #.$. .ar2all 4 um ar!uivo compactado !ue
termina com 'BtarBg$' e precisa de um programa de descompress)o para ser a2erto.
Para o ;indows, o C-Dip 4 um softBare (tam24m livre) !ue fa9 isso pra voc5.
Da(a o doBnload da seguinte pgina e instale em sua m!uina*
http://www.7-zip.org/
Goltando ao Django, locali9e 'Django-"BEBtarBg$' na pgina de DoBnload do
Django citada acima. Da(a o doBnload do ar!uivo e descompacte onde 2em !uiser.
Dentro da pasta criada " !ue provavelmente vai se chamar 'Django-"BE') voc5
vai criar um novo ar!uivo, chamado 'instalarBbat', edite usando o :loco de +otas
e escreva dentro o seguinte c+digo*
python setup.py install
F$
pause
Deche, salve, e cli!ue duas ve9es para e6ecutar.
Deito isso, o Django estar instalado. &gora vamos seguir para o ltimo passo*
instalar a biblioteca do banco de dados *67ite.
O =K0ite 4 um 2anco de dados simples, sem muitos recursos. H ideal para o
am2iente de cria()o e desenvolvimento. -)o d pra fa9er muitas coisas com ele,
mas voc5 dificilmente vai precisar de fa9er muitas coisas en!uanto cria seu site.
Para o Django tra2alhar em conjunto com o =K0ite, 4 preciso apenas instalar uma
2i2lioteca, chamada py*67ite, e nada mais.
Ent)o, v at4 a pgina seguinte e fa(a o doBnload do tarball (c+digo"fonte, com
e6tens)o .tar.g9).
http://oss.itsystementwicklung.de/trac/pysqlite/#ownloads
=e a instala()o do p3=K0ite apresentar erros de compilao no IindoBs, tente
instalar com um dos instaladores e6ecutveis dispon'veis na pgina de doBnload
acima. Osso @s ve9es ocorre por conse!u5ncia de algum tipo de incompati2ilidade
entre compiladores.
&p+s o doBnload, fa(a o mesmo !ue fe9 com o Django*
#. descompacte usando o R"9ip
F. crie o ar!uivo instalarBbat com a!uele mesmo c+digo dentro
7. e6ecute
M. pronto.
Pois 2em, agora voc5 tem um am2iente de desenvolvimento instalado para
come(ar a usar.
+o 7inu52 1ac e outros sistemas
=e voc5 usa 7inu5 ou 1ac, os passos n)o ser)o diferentes dos seguidos para o
IindoBs.
-o site do P3thon s)o dispon'veis os ar!uivos para doBnload e instala()o para
esses sistemas. -o caso do Django e p3=K0ite o processo 4 2asicamente o mesmo,
com as devidas diferen(as comuns entre os sistemas operacionais.
-ormalmente o 0inu6 j vem com o P3thon e o p3=K0ite instalados.
F#
)5iste um caminho mais fAcil0
=im, e6iste um caminho 2em mais fcil. /omo j foi dito l em cima, o processo
acima 4 mais dif'cil, mas, o melhor para o seu aprendi9ado.
=e !uiser instalar de forma mais fcil, use o Django*tac4. Geja neste site como
fa95"lo*
http://marinho!randao.com/!log/p/djangostack-"acil-para-o-
iniciante-aprender-django/
&lata9an respirou aliviado. &pesar da sopa de letrinhas, a coisa n)o parecia t)o
complicada.
ent)o tudo se resume a instalar 7 coisas* o P3thon, o Django e o p3=K0ite.
!ue s)o feitos de forma !ue os princ'pios do softBare livre sejam
preservados* usando outros softBares livres " completou -ena
e ent)o, o !ue vamos fa9er amanh)E
vamos criar o seu primeiro projeto. Goc5 j tem alguma id4ia do !ue !uer
fa9erE
sim, !uero dar um jeito de mandar mensagens para a minha fam'lia, mostrar
como tem sido a minha vida por a!ui, o !ue tenho desco2erto, algumas fotos dos
t5nis da 1ua 8...
ent)o o !ue voc5 !uer, 4 um blog. Gamos fa9er isso ent)o%
FF
!aptulo F# !riando um :log maneiro
Era uma manh) fria, o vento de outono 2alan(ava as folhas das poucas rvores
na rua onde &lata9an morava, e algu4m dei6ou ali um envelope engra(ado,
triangular. Para &lata9an, o envelope n)o era engra(ado, era e5atamente igual aos
envelopes mais usados em :atara.
Ele a2riu o envelope e tirou o o2jeto prateado relu9ente, com cheirinho de novo.
Qma das pontas do envelope estava ligeiramente amassada, mas n)o tinha
pro2lema, pois o papel eletrTnico era chamado de papel e6atamente por ser fle5vel.
-a imagem animada do papel, sua m)e es2ravejava por sua falta de
considera()o. Desde sua chegada, &lata9an n)o havia enviado se!uer um AalTA, mas
mal sa2ia sua m)e !ue por a!ui n)o havia uma ag5ncia do sistema interestelar de
correios.
as :atara tem um jeito de acessar a nossa Onternet, e ele teve ent)o a ideia de
criar um 2log.
Qm 2log 4 o jeito mais simples de escrever so2re sua vida. .oda ve9 !ue d
vontade de escrever, o sujeito vai l, cria um ttulo e escreve o !ue !uiser, e a
pgina mostra sempre os ltimos itens !ue ele escreveu.
Por.uG um blog0
Qm 2log 4 fcil e simples de se fa9er. E tam24m simples de criar novidades.
Hoje vamos dei6ar o :log funcionando, a seguir vamos esclarecer umas coisas,
melhorar outras, colocar os H**, depois vamos aos !omentArios, e assim por
diante. /ada pe!ueno passo de uma ve9, e 2em resolvido.
as antes de tudo, precisamos resolver uma !uest)o ainda em a2erto...
)scolhendo um editor
O Django n)o se prende a um editor espec'fico. E6istem centenas deles, alguns
com mais recursos, outros mais simples. H como modelos de t5nis, cada um usa o
F7
seu, e h a!ueles !ue preferem sapatos, sandlias, ou andar descal(os mesmo. H
ainda a!ueles n)o preferem, mas ainda assim o fa9em.
O editor !ue voc5 escolhe hoje, pode ser descartado amanh), e o pr+6imo
tam24m. -)o se trata de um casamento, mas sim de uma escolha do momento, at4
!ue voc5 encontra a!uele !ue se encai6a com o seu perfil.
Ent)o vamos come(ar pelo :loco de +otas, e depois vamos conhecer outros.
-42 agora vamos criar o projeto
&ntes de mais nada, vamos criar uma pasta para colocar nossos projetos*
c#<Projetos (no 0inu6 ou ac* IProjetos).
E agora a2ra o Prompt de comando dos 1*-D-* (no 0inu6 ou ac 4 o
!onsole ou %erminal) e locali9e a pasta criada com*
cd c:#$rojetos
Depois disso, digite o comando !ue cria projetos*
python c:#$ython25#%cripts#django-admin.py startproject meu&!log
FM
-o 0inu6 ou ac 4 um pou!uinho diferente*
' cd /$rojetos
' django-admin.py startproject meu&!log

Pronto, agora feche essa janela e vamos voltar @ pasta do projeto, em
c#<Projetos<meuJblog

&gora, vamos ver o site funcionando (mesmo !ue sem nada " ou com !uase
nada " dentro). -a pasta do projeto, crie um ar!uivo chamado 'e5ecutarBbat' e o
edite com o :loco de +otas. Dentro dele, escreva o seguinte c+digo*
python manage.py runser(er
pause
+ota# no 7inu5 e no 1ac-*K o e!uivalente aos ar!uivos B:A% s)o os ar!uivos
Bsh. & diferen(a 4 !ue eles n)o suportam o comando 'pause' e devem iniciar com a
seguinte linha*
FN
#)/!in/!ash
Goc5 deve tam24m definir a permiss)o de e6ecu()o ao ar!uivo usando o
comando chmod ?5 ou usando a janela de Propriedades do ar!uivo.
=alve o ar!uivo. Deche o ar!uivo. E6ecute o ar!uivo clicando duas ve9es so2re
ele.

&2ra seu navegador " o 1o$illa 3irefo5, por e6emplo " e locali9e o endere(o*
http://localhost:*+++/
E 4 isso !ue voc5 v5*
FP
as isso ainda n)o 4 nada. Goc5 ainda n)o possui nada em seu projeto. Ou pelo
menos, nada !ue algu4m possa ver.
- ar.uivo settings do projeto
&gora na pasta do projeto, edite o ar!uivo settingsBpy com o :loco de +otas e
fa(a as seguintes modifica(Ces*
#. & linha !ue come(a com DA%A:A*)J)+L8+), deve ficar com
DA%A:A*)J)+L8+) M Ns.lite9N
F. & linha !ue come(a com DA%A:A*)J+A1), deve ficar com
DA%A:A*)J+A1) M NmeuJblogBdbN
7. E logo a2ai6o da linha !ue possui NdjangoBcontribBsitesN2 acrescente
outra linha com NdjangoBcontribBadminN2
- ar.uivo de OH7s do projeto
=alve o ar!uivo. Deche o ar!uivo. &gora edite o ar!uivo urlsBpy, tam24m com o
:loco de +otas, fa9endo as seguintes modifica(Ces*
#. -a linha !ue possui P from djangoBcontrib import admin, remova o
AU A do in'cio " no se es.uea de remover o espao em branco
F. -a linha !ue possui P adminBautodiscoverQR, remova o AU A do in'cio
7. -a linha !ue possui P QrNSadminIQBTRN2 adminBsiteBrootR2, remova o AU A
do in'cio
=alve o ar!uivo. Deche o ar!uivo. &gora vamos gerar o 2anco de dados (isso
mesmo%).
Lerao do banco de dados
-a pasta do projeto (meuV2log), crie um ar!uivo chamado
gerarJbancoJdeJdadosBbat e escreva o seguinte c+digo dentro*
python manage.py syncd!
pause
=alve o ar!uivo. Deche o ar!uivo. E6ecute o ar!uivo, clicando duas ve9es so2re
ele.
& gera()o do 2anco de dados cria as ta2elas e outros elementos do 2anco de
dados e j cria tamb/m um usuArio de administrao do sistema. Osso acontece
FR
por!ue na!uele ar!uivo settingsBpy havia uma linha indicando isso (calma, logo
voc5 vai sa2er !ual).
=endo assim, ele pergunta pelo nome desse usurio (username), seu e-mail (se
voc5 digitar um e"mail invlido, ele n)o vai aceitar) e a senha.
&ssim, para ficar mais fcil, informe os dados assim*
Qsername* admin
E"mail* adminUgmailBcom
PassBord* "
PassBord (again)* "

&o e6i2ir a frase Pressione .ual.uer tecla para continuarB B B, feche a janela
volte ao navegador, pressione 3= pra ver como ficou.
FS
Osso aconteceu por!ue agora voc5 possui alguma coisa em seu projeto. E !uando
voc5 possui "alguma coisa", !ual!uer outra coisa !ue voc5 n)o possui 4
considerada como PAgina no encontrada. Ent)o, !ue coisa 4 essaE
A interface de administrao
-a 2arra de endere(o do navegador, locali9e o endere(o*
http://localhost:*+++/admin/
E a seguinte pgina ser carregada, para autentica()o do usurio.
F8
Goc5 vai informar o usurio e senha criados no momento da gera()o do 2anco
de dados*
Qsername* admin
PassBord* "

E ap+s clicar em 7og in, a seguinte pgina ser carregada*
7$
!riando a primeira aplicao
&gora, vamos criar uma aplica()o, chamada 'blog', ela vai ser responsvel
pelas funcionalidades do 2log no site. Portanto, crie uma pasta chamada 'blog' e
dentro dela crie os ar!uivos a2ai6o*
VVinitVV.p3
models.p3
admin.p3
&2ra o ar!uivo modelsBpy com o :loco de +otas e escreva o seguinte c+digo
dentro*
"rom django.d! import models
class ,rtigo-models..odel/:
titulo 0 models.1har2ield-ma3&length04++/
conteudo 0 models.5e3t2ield-/
pu!licacao 0 models.ate5ime2ield-/
=alve o ar!uivo. Deche o ar!uivo.
&gora a2ra o ar!uivo adminBpy com o :loco de +otas e escreva dentro*
"rom django.contri! import admin
"rom models import ,rtigo
admin.site.register-,rtigo/
7#
=alve o ar!uivo. Deche o ar!uivo.
Gamos voltar @ pasta do projeto (meuJblog), e editar novamente o ar!uivo
settingsBpy, fa9endo o seguinte*
#. &2ai6o da linha !ue possui NdjangoBcontribBadminN2 acrescente outra
linha com NblogN2
=alve o ar!uivo. Deche o ar!uivo.
E agora volte ao navegador, pressionando a tecla 3=*

Opa% &gora vemos ali uma coisa nova* uma cai6a da nova aplica()o 'blog'.
as como nem tudo s)o flores, ao clicar no lin> Artigos, ser e6i2ido um erro,
de 2anco de dados.

7F
Osso acontece por!ue voc5 n)o gerou o 2anco novamente, depois de criar a nova
aplica()o. Ent)o vamos fa9er isso.
/li!ue duas ve9es so2re o ar!uivo gerarJbancoJdeJdadosBbat e veja o
resultado a seguir*

&gora, ao voltar ao navegador e atuali9ar a pgina com 3=, a pgina ser
carregada da maneira desejada*

77
Gamos inserir o primeiro artigoE
/li!ue so2re o lin> 'Add artigo' e preencha as informa(Ces, clicando por fim
no 2ot)o '*ave' para salvar.

7M
Jom, j temos a interface de administra()o do 2log funcionando, agora vamos
ao mais interessante%
*altando da administrao para a apresentao
Jom, temos a interface de administra()o do 2log funcionando, mas isso ainda
n)o 4 suficiente, por!ue os visitantes do 2log precisam ter uma vis)o mais
agradAvel e limitada dessas informa(Ces, e no caso da m)e de &lata9an,
multipli!ue isso por dois.
Pois ent)o vamos agora fa9er uso do poder das generic views e dos templates
do Django para criar a pgina onde vamos apresentar os artigos !ue o &lata9an
escrever.
Gamos ent)o come(ar criando OH7s para isso.
Q10s s)o os endere(os das pginas do site. Qm e6emplo 4 a
http#IIlocalhost#VEEEIadminI, apontada para a interface de administra()o.
&o tentar carregar a Q10 http#IIlocalhost#VEEEI em seu navegador, ser e6i2ida
a!uela pgina amarela com PAgina no encontrada, se lem2raE Pois ent)o agora
vamos criar uma pgina para responder !uando a!uela Q10 for chamada.
-a pasta do projeto (meuJblog), a2ra o ar!uivo urlsBpy para editar, e modifi!ue
para ficar da seguinte maneira*
"rom django.con".urls.de"aults import 6
# 7ncomment the ne3t two lines to ena!le the admin:
"rom django.contri! import admin
admin.autodisco(er-/
"rom !log.models import ,rtigo
urlpatterns 0 patterns-889
-r8:'89 8django.(iews.generic.date&!ased.archi(e&inde389
;8queryset8: ,rtigo.o!jects.all-/9
8date&"ield8: 8pu!licacao8</9
-r8:admin/-.6/89 admin.site.root/9
/
7N
=alve o ar!uivo. Deche o ar!uivo. Golte ao navegador, e pressione 3= para
atuali9ar a pgina, e o resultado ser como este a2ai6o*
Osso acontece por!ue ainda falta um ar.uivo em >%17 para e6i2ir as
informa(Ces do :log, !ue chamamos de %emplate.
Gamos cri"loE
O>, a2ra a pasta blog, contida na pasta da projeto (onde j est)o os ar!uivos
JJinitJJBpy, modelsBpy e adminBpy), crie uma pasta chamada 'templates' e
dentro dela crie outra pasta, chamada 'blog'. Por fim, dentro da nova pasta criada,
crie novo ar!uivo chamado 'artigoJarchiveBhtml' e escreva o seguinte c+digo
dentro*
=html>
=!ody>
=h4>.eu !log=/h4>
;? "or artigo in latest ?<
=h2>;; artigo.titulo <<=/h2>
;; artigo.conteudo <<
;? end"or ?<
7P
=/!ody>
=/html>
Este 4 um H.0 simples, !ue percorre a lista de artigos do blog e e6i2e seu
%tulo e !ontedo.
Ateno# neste momento, 4 importante fechar a janela do 1*-D-* (!onsole ou
%erminal, no 0inu6 ou ac) onde o Django est rodando, e e6ecutar novamente o
ar!uivo e5ecutarBbat. Osto se fa9 necessrio, pois 4 a primeira ve9 !ue adicionamos
um template no site, o !ue o2riga !ue todo o Django seja iniciado novamente do
9ero.
Geja como ficou*
Jom, ent)o, 4 isso%
3inali$ando por hojeBBB
&os poucos &lata9an vai perce2endo !ue a cada novo passo !ue ele d, as
e6plica(Ces detalhadas de /artola e, especialmente -ena, v)o se tornando
desnecessrias, pois ele vai formando o conhecimento necessrio para fa9er a!uelas
tarefas mais comuns.
-o entanto, 4 muito claro pra ele !ue h muitas coisas n)o e6plicadas (ou pouco
e6plicadas) ali. Doi a' !ue ele se virou para -ena e disse*
Err... fascinante, mas, eu ainda estou sem entender a maior parte das coisas...
como por e6emplo a!uele...
/alma meu amigo, dei6a de ser fominha, uma coisa de cada ve9 " interferiu o
7R
sorridente /artola, 2atendo em seu om2ro e dei6ando cair um dos fones do
ouvido.
Gamos respirar um pouco, amanh) vamos e6plicar o por!u5 de cada coisa, e
voc5 vai compreender cada um desses ar!uivos criados, editados, modificados,
e6ecutados, enfim. as isso s+ depois de um 2om suco% " -ena se empolgou
com a vontade de &lata9an, !ue se empolgou com a empolga()o de -ena.
/artola j era empolgado por nature9a.
7S
!aptulo =# )ntendendo como o Django trabalha
Kuando ainda era crian(a, &lata9an andava pela rua
alegremente !uando 9uniu uma 2ola de metal cheia de
2ra(os perto de sua ca2e(a.
-a verdade n)o eram muitos 2ra(os, eram apenas
dois mesmo.
& 2ola de metal era uma esp4cie de ro2T de modelo
antigo. =eus circu'tos pareciam n)o funcionar muito
2em, mas ele emanava um sorriso arregalado, num jeito
espalhafatoso !ue &lata9an gostou.
Qm homem gritou*
Gai :all$er% Gai :all$er%
O ro2T seguiu seu caminho, voando a menos de F metros de altura em dire()o @
pra(a.
-a pra(a havia uma mesa comprida. &ntes da mesa estava um menino vestido
de despachante, segurando um carim2o, e sentados ao longo da mesa haviam ro2Ts
de modelos diferentes, cada um com alguns apetrechos. Qm deles tinha o2jetos de
2ar2earia, outro tinha colas, outro tinha tintas com pinc4is, e assim por diante.
Jall9er entregou um cu2o de 2orracha ao menino, ele gritou algo como Ase()o
MF%A e passou o cu2o ao primeiro ro2T da mesa, !ue fe9 alguma coisa no cu2o e o
passou ao pr+6imo ro2T, !ue o cheirou e n)o fe9 nada, depois passou adiante.
Do outro lado da mesa havia uma mulher alta, magra e de pele rosada !ue
rece2eu o cu2o do ltimo ro2T, cheirou, a2riu, tirou um papel de dentro e leu,
depois guardou, pegou uma coisa em sua 2olsa e devolveu ao ro2T, !ue refe9 o
ritual @s avessas, passando a coisa para o pr+6imo ro2T e assim at4 chegar ao
:all$er, !ue voltou em velocidade para entregar a coisa a um senhor do outro lado
da rua, pr+6imo do muro.
&lata9an ouviu o senhor di9er*
78
uito 2em :all$er, muito 2em.
Osso se repetiu por mais ve9es. Ws ve9es o senhor sorria, @s ve9es n)o. Pegava
outro cu2o, entregava ao Jall9er e assim se seguia...
Eles estavam jogando :hall$, um comple6o jogo muito praticado nas escolas
para adolescentes.
@oltando ao DjangoBBB
-a Be2, as coisas s)o parecidas.
Omagine !ue o senhor do outro lado da rua 4 o seu usuArio, usando o navegador.
O menino 4 o OH7 dispatcher.
Os ro2Ts @ mesa s)o middlewares.
& mo(a rosada, ao final da mesa, 4 uma view.
O cu2o 4 uma re.uisio (ou >ttpHe.uest).
& coisa !ue a mo(a devolveu aos ro2Ts 4 uma resposta (ou >ttpHesponse).
E por fim, o maluco e imprevis'vel :all$er, 4 a pr+pria 8nternet.
Ou seja, cada !ual @ sua ve9, fa9endo seu papel na linha de produ()o, para
receber um pedido do usuArio e retornar uma resposta e.uivalente, !ue na
maioria das ve9es, 4 uma pgina 2onita e colorida.
)ntendendo a re.uisio
-a re!uisi()o (ou >ttpHe.uest) h diversas informa(Ces. Qma das informa(Ces
4 a Q10, !ue 4 composta pelo protocolo, o dom'nio, a porta (@s ve9es), o caminho e
os par?metros (@s ve9es tam24m).
E6emplo*
http://localhost:*+++/admin/@nome0.ychellAidade045
Protocolo* http
Dom'nio* localhost
Porta* VEEE
/aminho* IadminI
Par?metros* nome M 1ychell e idade M "=
Kuando a porta n)o 4 citada, ent)o voc5 deve entender !ue se trata da porta VE,
M$
a porta padr)o do protocolo >%%P.
Outras informa(Ces !ue se encontram na re!uisi()o s)o a!uelas so2re o
navegador e computador do usurio, como seu 8P, sistema operacional, idiomas
suportados, coo4ies e diversas outras coisas.
- >andler
& primeira coisa !ue acontece !uando a re!uisi()o chega ao Django, est no
handler. Essa parte nunca / vista ou notada por vocG, mas 4 o primeiro passo antes
da re!uisi()o chegar aos middleBares, e tam24m 4 o ltimo passo antes da resposta
voltar do Django para o usurio final.
1iddlewares
iddleBares s)o pe!uenos trechos de c+digo !ue analisam a re.uisio na
entrada e a resposta na sada. & re!uisi()o 4 analisada por eles.
@ocG pode determinar .uais middlewares estaro na fila W mesa para
analisar a re.uisio e pode at/ criar os seus pr(prios middlewaresB
Qm dos middleBares fa9 com !ue toda a segurana e autenticao de usuArios
seja feita. Outro adiciona a fun()o de sesso, uma forma de memori9ar o !ue o
usurio est fa9endo para atend5"lo melhor. H ainda outro middleBare, !ue
memori9a as respostas no !ache, pois se caso a pr+6ima re!uisi()o tenha o mesmo
caminho e os mesmos parXmetros, ele retorna a resposta memori9ada, evitando o
tra2alho de ser processada novamente pela view.
=endo assim, ap+s passar por todos esses middleBares, a re!uisi()o passa a ter
outras informa(Ces, como .ual usuArio estA autenticado, sesso atual e outras
coisas.
- OH7 Dispather
Depois de passar pelos middleBares, a re!uisi()o 4 analisada pelo Q10
Dispatcher, um importante componente do Django !ue verifica o endereo "
especialmente a parte do caminho " e verifica o ar!uivo urlsBpy do projeto para
apontar !ual view ser chamada para dar a resposta.
Ah2 a view
& vieB 4 uma fun()o escrita em P3thon, e na maioria das ve9es, escrita por
voc5.
Ela fa9 isso* rece2e uma re!uisi()o (>ttpHe.uest) e retorna uma resposta
M#
(>ttpHesponse).
H a!ui !ue entra seu tra2alho dirio, !ue 4 analisar uma re!uisi()o, fa9er algo no
banco de dados e retornar uma pgina.
O Django possui algumas views prontas para coisas !ue sempre funcionam do
mesmo jeito. Elas s)o chamadas Leneric @iews e est)o espalhadas por toda parte.
H generic views teis para 2logs, para cadastros em geral, para lem2rar senha,
autenticar, sair do sistema, redirecionar, enfim, h muitas delas.
@ocG no / obrigado a usar generic viewsB )las esto lA para vocG usA-las se
assim o desejarB
&s vieBs escritas por voc5 devem ser escritas em um ar!uivo chamado
viewsBpy.
-s ar.uivos de templates
&s pginas no Django s)o em geral guardadas em %emplates, !ue s)o ar!uivos
H.0 (ou outro formato) !ue possuem sua pr+pria l+gica em interpretar @!uilo !ue
lhes 4 passado e no final renderi9ar um H.0, !ue 4 passado como resposta ao
usurio. -o entanto, esta n)o 4 uma regra, pois muitas ve9es n)o ser retornado um
H.0 como resposta. as isso ser muito mais esclarecido nos pr+6imos
cap'tulos.
A camada de 1odelo
Para arma9enar e resgatar informa(Ces do banco de dados, n)o 4 necessrio ir
at4 ele e conhecer a linguagem dele (o 2om, velho, e cada ve9 mais sumido *67).
Goc5 usa uma ferramenta do Django chamada -H1, !ue interpreta o seu c+digo,
leva a!uilo at4 o 2anco de dados, e depois devolve as informa(Ces desejadas.
& parte do c+digo onde voc5 configura !uais s)o seus modelos de dados e !ue
tipo de informa(Ces eles devem arma9enar, 4 um ar!uivo chamado modelsBpy.
MF

)nto2 tudo se resume em 1@!
1@! 4 a sigla !ue resume tudo isso*
odelo (odel)
Gis)o (GieB)
/ontrole (/ontroller)
1odelo 4 onde est)o as defini(Ces dos dados, como eles devem ser
arma9enados e tratados. H l !ue voc5 di9 !uais campos uma ta2ela deve ter, seus
tipos e valores padr)o e se eles s)o o2rigat+rios ou n)o. Dentre outras coisas.
@iso s)o as fun(Ces !ue recebem re.uisiYes e retornam respostas, ao
usurio, a outro computador, a uma impressora ou !ual!uer outra coisa e6terna. Ou
seja, as vieBs.
E !ontrole s)o todas as coisas !ue ficam no meio do caminho, como o handler,
os middlewares e o OH7 dispatcher. & maior parte dessas coisas 4 feita pelo
pr+prio Django, e voc5 deve se preocupar pouco ou nada com isso.
E onde entram o banco de dados e os templatesE
O 2anco de dados 4 a camada de persistGncia, e n)o fa9 parte do G/, pois n)o
fa9 parte do Django em si.
M7
Os templates s)o ar!uivos utili9ados pelas vieBs, s)o apenas au6iliares, como
uma 2olsa utilitria ao lado, !ue voc5 usa se !uiser ou se precisar.
Passando adianteBBB
Dascinante tudo isso, n)oE eu pai conta !ue nas f2ricas de softBare mais
antigas tra2alhavam com outro conceito, chamado !lienteI*ervidor, mas isso
nunca caiu 2em na Ie2, era muito lento...
Os olhos de -ena at4 2rilhavam. Ela adorava essas coisas de conceitos e
ar!uitetura.
Jom, n)o 4 muito diferente de jogar :hall$. /ada pedacinho tem um papel
simples a cumprir. /omplicado 4 pegar a coisa toda de uma ve9, mas se voc5
jogar numa posi()o de cada ve9, vai ver !ue 4 fcil de jogar... " respondeu um
&lata9an mais aliviado.
/artola estava um pouco disperso, entretido com seu gadget. Ele o havia
configurado para rece2er os podcasts do %his ;ee4 8n Django sempre !ue
houvesse novidades, e havia aca2ado de chegar um epis+dio novo.
-o pr+6imo cap'tulo, vamos colocar o H** para funcionar no Jlog, e entender
como 4 fcil levar suas novidades @s pessoas sem !ue elas precisem vir at4 voc5.
MM
Captulo 6: O RSS o entregador fiel
Cartola obcecado por informao: l notcias de
poltica, esportes e economia, sites com artigos sobre
robtica, receitas de comida senegalesa e blogs de nerds
de renome.
Nena no deixa por menos, mas ela gostava mesmo
de entretenimento. Acessa blogs de celebridades, ao
mesmo tempo !e c!rte cada novidade sobre
metodologias "geis.
Alata#an percebe! !e seria complicado concorrer o precioso tempo de se!s
leitores com essa gente toda, ento logo ele noto! !e precisa m!dar se! blog para
p!blicar se!s textos em formato RSS.
$%% no se trata da sociedade conservadora mais rison&a de 'atara. $%%
somente !m formato !e seg!e os padr(es do )*+, mas !e foi criado para
carregar informa(es como Ttulo, Data de Publicao e Contedo ,dentre o!tras-
de artigos. .!al!er site !e lance esse tipo de informao, pode p!blicar se!
conte/do tambm em forma de $%% e assim se!s leitores !sam programas como o
Google Reader para serem avisados sempre !e &o!ver novidades.
$%% tambm m!ito /til para Podcat e ainda para e!portar e i"portar esse
mesmo tipo de informao.
0 claro, o 12ango 2" vem com isso pronto, sem dor e com bons rec!rsos3
#nto $a"o l%&
4ara trabal&ar com $%% no 12ango, vamos antes a2!star alg!mas coisas !e
sero necess"rias da!i em diante. 0 o mel&or momento para fa#er esses a2!stes,
agora.
'(utando etting funda"entai do pro(eto
No 12ango, !m ite fr!to de !m pro(eto, !e composto de alg!mas ,o!
56
m!itas- aplica)e.
7ma aplicao !m con2!nto 8 de preferncia no extenso 8 de f!ncionalidades
com foco em resolver !ma !esto especfica. 7m *log por exemplo, !ma
aplicao.
9odo pro2eto poss!i !m ar!ivo c&amado etting+p,, onde so feitas
config!ra(es !e determinam a s!a essncia.
7ma coisa importante para a2!star nas settings do pro2eto, a T-.#/0O1#. :
nesta setting !e determinamos em !e f!so &or"rio o pro2eto deve estar ade!ado.
;" !ma lista desses f!sos &or"rios no seg!inte site:
http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
Na pasta do pro2eto ,"eu/blog-, abra o ar!ivo etting+p, no editor e locali#e
a seg!inte lin&a:
TIME_ZONE ! "#meri$a/%hi$ago"
Agora modifi!e para ficar assim:
TIME_ZONE ! "#meri$a/&ao_'a()o"
0ste apenas !m exemplo. Caso no este2a na #ona de f!so &or"rio da cidade de
%o 4a!lo, v" at o site citado acima, encontre o se! f!so &or"rio, e a2!ste a
T-.#/0O1# para cdigo respectivo.
%alve o ar!ivo. <ec&e o ar!ivo.
Deter"inando a ordenao do artigo do *log
Agora, vamos = pasta da aplicao blog. Nesta pasta, abra o ar!ivo "odel+p,
com o editor e locali#e a seg!inte lin&a:
$)ass #rtigo*mode)s.Mode)+:
*odifi!e esse trec&o do cdigo de forma !e fi!e assim:
$)ass #rtigo*mode)s.Mode)+:
$)ass Meta:
ordering ! *",p(b)i$a$ao"-+
0ssa modificao fa# com !e a listagem dos artigos se2a sempre feita pelo
campo 2publicacao2. Ali &" !m detal&e importante: o inal de "eno , 8 - =
es!erda de >p!blicacao> indica !e a orde" de$e er decrecente.
+ocali#e esta o!tra lin&a:
p(b)i$a$ao ! mode)s..ateTime/ie)d*+
0 modifi!e para ficar assim:
5?
p(b)i$a$ao ! mode)s..ateTime/ie)d*
defa()t!datetime.now-
b)ank!Tr(e
+
@sso fa# com !e no se2a mais necess"rio informar o valor para o campo de
p!blicao, pois ele ass!me a data e 3ora atuai a!tomaticamente. A arg!mento
blan4 indica !e o campo pode er dei!ado e" branco, 2" !e ele vai ass!mir a
data e &ora at!ais nesse caso.
4orm, isso no basta.
A elemento dateti"e no est" emb!tido a!tomaticamente no se! ar!ivo, e
voc deve tra#8lo de onde ele est", para !e o 4Bt&on o !se da forma ade!ada. 1o
contr"rio, o 4Bt&on ir" levantar !m erro, indicando !e o ob2eto dateti"e no
existe.
4ortanto, acrescente a lin&a a seg!ir no incio do ar!ivo, na primeira lin&a:
from datetime import datetime
1essa forma, o ar!ivo "odel+p, fica assim:
from datetime import datetime
from d0ango.db import mode)s
$)ass #rtigo*mode)s.Mode)+:
$)ass Meta:
ordering ! *",p(b)i$a$ao"-+
tit()o ! mode)s.%har/ie)d*ma1_)ength!233+
$onte(do ! mode)s.Te1t/ie)d*+
p(b)i$a$ao ! mode)s..ateTime/ie)d*
defa()t!datetime.now-
b)ank!Tr(e
+
Alg!mas coisas sobre 4Bt&on sero esclarecidas da!i a alg!ns capt!los. *as
por &ora, importante ressaltar !e voc deve e"pre repeitar a edentao. A
padro mais indicado no 4Bt&on !e se!s blocos se2am sempre edentados a cada 5
epao, portanto, m!ito c!idado com a tecla de tab!lao. No a mesma coisa.
*!ito bem. <eitos esses a2!stes, vamos ao !e realmente interessa.
5C
'plicando RSS do artigo do blog
A primeira coisa a compreender a!i, !e o 12ango feito por pe!enas
partes. 0 a maior parte dessas pe!enas partes no so ativadas !ando voc cria
!m pro2eto.
0sse !m c!idado essencial para !e se! pro2eto fi!e o "ai le$e e co"pacto
po$el, carregando para a memria e processando somente a!ilo !e
necess"rio. 0 claro, !em sabe o !e necess"rio, $oc6.
As aplica(es especiais !e 2" vm com o 12ango, so c&amadas de contrib, e
a!ela !e fa# o trabal&o pesado do $%% c&amada de ,ndication.
Damos ento editar novamente o ar!ivo etting+p, da pasta do pro2eto, para
adicionar a aplicao ,ndication =s aplica(es do pro2eto.
+ocali#e a lin&a abaixo:
IN&T#LLE._#''& ! *
No 4Bt&on, toda expresso !e divida entre sinais de vrg!la , , - e contido
entre parnteses, c&amada de Tupla. 9rata8se de !ma lista !e no ser"
modificada en!anto o pro2eto estiver em exec!o.
-1ST'77#D/'PPS !ma t!pla, onde indicamos todas as aplica(es do
pro2eto. 9odos os itens contidos ali tero !m tratamento especial no se! pro2eto,
indicando clae de "odelo de dado ,tabelas para o banco de dados-, $ie8 e
o!tras informa(es contidas em se!s ar!ivos "odel+p,, $ie8+p,, ad"in+p,,
dentre o!tros.
Damos portanto, adicionar ao final da t!pla a aplicao
9d(ango+contrib+,ndication9, a nossa estrela principal a!i. 4ortanto, agora a t!pla
vai ficar assim:
IN&T#LLE._#''& ! *
"d0ango.$ontrib.a(th"-
"d0ango.$ontrib.$ontenttypes"-
"d0ango.$ontrib.sessions"-
"d0ango.$ontrib.sites"-
"d0ango.$ontrib.admin"-
"d0ango.$ontrib.syndi$ation"-
"b)og"-
+
No necess"rio !e a ordem se2a exatamente esta, mas recomend"vel !e se
separe as aplica(es contrib das demais aplica(es, sempre !e possvel.
5E
%alve o ar!ivo. <ec&e o ar!ivo. Agora vamos adicionar !ma :R7 para este
nosso RSS.
+ocali#e o ar!ivo url+p, da pasta do pro2eto e abra8o para edio.
Neste ar!ivo, cada tupla informada dentro da f!no pattern;< indica !m
padro de 7$+. De2a como est" abaixo:
(r)patterns ! patterns*""-
*r"45"- "d0ango.6iews.generi$.date_based.ar$hi6e_inde1"-
7"8(eryset": #rtigo.ob0e$ts.a))*+-
"date_fie)d": "p(b)i$a$ao"9+-
*r"4admin/*.:+"- admin.site.root+-
+
4ortanto, vamos adicionar a nossa nova 7$+ aps a /ltima t!pla, para ficar
assim:
(r)patterns ! patterns*""-
*r"45"- "d0ango.6iews.generi$.date_based.ar$hi6e_inde1"-
7"8(eryset": #rtigo.ob0e$ts.a))*+-
"date_fie)d": "p(b)i$a$ao"9+-
*r"4admin/*.:+"- admin.site.root+-
*r"4rss/*;'<(r)=.:+/5"- "d0ango.$ontrib.syndi$ation.6iews.feed"-
7"feed_di$t": 7"()timos": >)timos#rtigos99+-
+
A t!pla adicionada indica !e a nova 7$+ vai exibir os artigos em formato $%%
na seg!inte endereo:
http://)o$a)host:?333/rss/()timos/
No se es!ea da importFncia dessa palavra ulti"o, pois ela !e identifica o
nosso $%% ,sim, podemos ter diversos $%% diferentes em !m mesmo site-.
*as ainda no s!ficiente, pois o :lti"o'rtigo !m estran&o ali. %e voc
rodar o sistema agora, vai notar !ma mensagem de erro, pois esse elemento
:lti"o'rtigo realmente no existe.
4ois ento, na lin&a s!perior = iniciada com urlpattern, vamos adicionar a
seg!inte lin&a:
from b)og.feeds import >)timos#rtigos
0 agora todo o ar!ivo url+p,, depois das modifica(es, fica assim:
5G
from d0ango.$onf.(r)s.defa()ts import :
@ >n$omment the ne1t two )ines to enab)e the admin:
from d0ango.$ontrib import admin
admin.a(todis$o6er*+
from b)og.mode)s import #rtigo
from b)og.feeds import >)timos#rtigos
(r)patterns ! patterns*""-
*r"45"- "d0ango.6iews.generi$.date_based.ar$hi6e_inde1"-
7"8(eryset": #rtigo.ob0e$ts.a))*+- "date_fie)d": "p(b)i$a$ao"9+-
*r"4admin/*.:+"- admin.site.root+-
*r"4rss/*;'<(r)=.:+/5"- "d0ango.$ontrib.syndi$ation.6iews.feed"-
7"feed_di$t": 7"()timos": >)timos#rtigos99+-
+
4ois bem. %alve o ar!ivo. <ec&e o ar!ivo.
Damos seg!ir para a derradeira tarefa antes de ver o nosso $%% f!ncionando: na
pasta da aplicao blog, crie !m novo ar!ivo c&amado feed+p,, e escreva o
seg!inte cdigo dentro:
from d0ango.$ontrib.syndi$ation.feeds import /eed
from mode)s import #rtigo
$)ass >)timos#rtigos*/eed+:
tit)e ! ">)timos artigos do b)og do #)atazan"
)ink ! "/"
def items*se)f+:
ret(rn #rtigo.ob0e$ts.a))*+
def item_)ink*se)f- artigo+:
ret(rn "/artigo/Ad/"Aartigo.id
4ronto3 Antes de entender em detal&es o !e fi#emos no cdigo acima, vamos
6H
ver o res!ltado disso3
4rimeiro, exec!te o se! pro2eto, clicando d!as ve#es sobre o ar!ivo
e!ecutar+bat da pasta do pro2eto.
Agora locali#e o seg!inte endereo em se! navegador:
http://)o$a)host:?333/rss/()timos/
0 o res!ltado ser" este:

Iosto! do !e vi!J No... e! ainda no. De2a !e o ttulo e a decrio do
artigo esto como 2'rtigo ob(ect2. No est" como ns !eremos. Damos l"
resolver issoJ
Na pasta da aplicao blog, &" !ma o!tra pasta, c&amada te"plate. 1entro
dela, voc vai criar mais !ma pasta, c&amada feed.
1entro da nova pasta, vamos criar !m template !e ser" !sado para determinar o
ttulo de cada artigo. 0le ser" c&amado ulti"o/title+3t"l. 0sse nome se deve =
soma do nome desse $%% , ulti"o - com /title+3t"l, o nome padro para isso !e
!eremos fa#er. 0screva o seg!inte cdigo dentro:
77 ob0.tit()o 99
%alve o ar!ivo. <ec&e o ar!ivo. Crie !m novo ar!ivo, c&amado
ulti"o/decription+3t"l, e escreva o seg!inte cdigo dentro:
6K
77 ob0.$onte(do 99
%alve o ar!ivo. <ec&e o ar!ivo. D" ao navegador e pressione a tecla => para
ver como fico!.

.!e tal agoraJ 0st" mel&orJ
AL, vamos con&ecer !m po!co mais do !e fi#emos.
A atrib!to title recebe! o valor 9:lti"o artigo do blog do 'lata?an9, !e
tt!lo deste $%%.
A atrib!to lin4 recebe! o valor 9@9, indicando !e o endereo na Meb e!ivalente
a este $%% o do ca"in3o >N>, !e somado ao protocolo ,>&ttp>-, domnio
,>local&ost>- e porta ,>EHHH>-, fica assim:
http://)o$a)host:?333/
A mtodo def ite";elf< carrega !ma lita de artigo. A lin&a return
'rtigo+ob(ect+all;< indica !e este mtodo vai retornar no $%% todo os ob2etos da
classe 'rtigo ,em ordem decrescente pelo campo publicacao, lembra8seJ-.
0 o mtodo def ite"/lin4;elfA artigo< retorna, para cada artigo, se! endereo
na Meb, !e definimos para ser o camin&o >NartigoN> somado ao id do artigo, mais
!ma barra , N - ao final, !e no fim da &istria vai ficar assim, por exemplo, para !m
artigo de id >B:
http://)o$a)host:?333/artigo/BC/
6O
No entanto, ns podemos fa#er isso de !ma forma diferente. <aa assim: remova
as seg!intes lin&as do ar!ivo feed+p,:
def item_)ink*se)f- artigo+:
ret(rn "/artigo/Ad/"Aartigo.id
%alve o ar!ivo. <ec&e o ar!ivo. Aps !m => no navegador, na 7$+ do $%%,
ve2a o res!ltado:

A mensagem de erro completa esta:
Iive Bo!r Artigo class a getPabsol!teP!rl,- met&od, or define an
itemPlinL,- met&od in Bo!r <eed class.
De2a !e ele s!gere a criao do mtodo ite"/lin4 ,!e acabamos de remover-
o! do mtodo get/abolute/url;< na classe 'rtigo. Damos fa#er issoJ
Na pasta da aplicao blog, abra o ar!ivo "odel+p, para edio e ao final da
classe 'rtigo ,o final do ar!ivo- adicione as seg!intes lin&as de cdigo:
def get_abso)(te_(r)*se)f+:
ret(rn "/artigo/Ad/"Ase)f.id
A! se2a, agora o ar!ivo "odel+p, todo vai ficar da seg!inte forma:
from datetime import datetime
from d0ango.db import mode)s
6Q
$)ass #rtigo*mode)s.Mode)+:
$)ass Meta:
ordering ! *",p(b)i$a$ao"-+
tit()o ! mode)s.%har/ie)d*ma1_)ength!233+
$onte(do ! mode)s.Te1t/ie)d*+
p(b)i$a$ao ! mode)s..ateTime/ie)d*
defa()t!datetime.now-
b)ank!Tr(e
+
def get_abso)(te_(r)*se)f+:
ret(rn "/artigo/Ad/"Ase)f.id
%alve o ar!ivo. <ec&e o ar!ivo. 1e volta ao navegador, at!ali#e a p"gina com
=> e ve2a !e voltamos ao normal3

A !e fi#emos agora foi definir !m endereo aboluto de :R7 para artigo, o!
se2a, cada artigo tem o se! endereo, e esse endereo /til no apenas para o $%%,
mas tambm para o!tros fins, De2a por exemplo o seg!inte endereo:
65
http://)o$a)host:?333/admin/b)og/artigo/2/
A res!ltado :

Noto! o linL 2Cie8 on ite2 em desta!e no canto s!perior direitoJ 4ois bem,
cli!e sobre ele, e o res!ltado ser":

;!mmm... no sai! como !eramos... *as isso acontece! pelo seg!inte
motivo:
A 12ango poss!i s!porte a "ltiplo ite e" u" nico pro(eto. @sso !er
di#er !e se voc tem !m pro2eto de blog, voc pode ter os blogs do Cartola, do
Alata#an e da Nena, todo ele uando o "e"o pro(eto, ainda !e trabal&em com
66
informa(es distintas. @sso =s ve#es m!ito /til.
.!ando !m pro2eto criado, ele recebe !m 2ite2 padro, !e tem o endereo
3ttp:@@e!a"ple+co", 2!stamente para voc modificar e deixar como !iser. 0nto
vamos m!dar isso para 3ttp:@@local3ot:DEEE@, certoJ
Carreg!e o endereo do ad"in no navegador:
http://)o$a)host:?333/admin/
Na caixa 9Site9, cli!e no item 9Site9. Na p"gina carregada, cli!e sobre
9e!a"ple+co"9, e modifi!e, s!bstit!indo 9e!a"ple+co"9 para 9local3ot:DEEE9,
assim:
Cli!e no boto Sa$e.
<ec&e a 2anela de exec!o do 12ango e exec!te novamente o ar!ivo
e!ecutar+bat da pata do pro(eto.
Dolte = 7$+ anterior , &ttp:NNlocal&ost:EHHHNadminNblogNartigoNKN -, cli!e em
2Cie8 on ite2 e o res!ltado ser" este:
6?
Rom, 2" con&ecemos esta p"gina, certoJ @sso !er di#er !e essa p"gina no
existe.
0sta p"gina ser" a p%gina de u" artigo epecfico. A! se2a, Alata#an tem !m
blog, e na p"gina principal do blog so exibidos todos os artigos, porm, cada artigo
poss!i s!a prpria 7$+ 8 s!a prpria p"gina. 0nto vamos cri"8laJ
Na pasta do pro2eto, abra o ar!ivo url+p, para edio e adicione a seg!inte
7$+:
*r"4artigo/*;'<artigo_id=DdE+/5"- "b)og.6iews.artigo"+-
A! se2a, o ar!ivo url+p, vai ficar assim:
from d0ango.$onf.(r)s.defa()ts import :
@ >n$omment the ne1t two )ines to enab)e the admin:
from d0ango.$ontrib import admin
admin.a(todis$o6er*+
from b)og.mode)s import #rtigo
from b)og.feeds import >)timos#rtigos
(r)patterns ! patterns*""-
*r"45"- "d0ango.6iews.generi$.date_based.ar$hi6e_inde1"-
7"8(eryset": #rtigo.ob0e$ts.a))*+-
6C
"date_fie)d": "p(b)i$a$ao"9
+-
*r"4admin/*.:+"- admin.site.root+-
*r"4rss/*;'<(r)=.:+/5"-
"d0ango.$ontrib.syndi$ation.6iews.feed"-
7"feed_di$t": 7"()timos": >)timos#rtigos99+-
*r"4artigo/*;'<artigo_id=DdE+/5"- "b)og.6iews.artigo"+-
+
%alve o ar!ivo. <ec&e o ar!ivo.
Dolte ao navegador, pressione a tecla => e observe !e a mensagem m!do!:
0ssa mensagem indica !e a 7$+ informada , &ttp:NNlocal&ost:EHHHNartigoNKN -
realmente existe, mas !e no foi encontrada a vieM 9blog+$ie8+artigo9. @sso
acontece por!e a vieM realmente no existe. Ainda3
Agora, na pasta da aplicao blog, crie !m novo ar!ivo, c&amado $ie8+p, e
escreva o seg!inte cdigo dentro:
from d0ango.short$(ts import render_to_response
def artigo*re8(est- artigo_id+:
ret(rn render_to_response*"b)og/artigo.htm)"+
%alve o ar!ivo. <ec&e o ar!ivo. Dolte ao navegador, pressione => e o res!ltado
2" m!do!:
6E
A mensagem di#: 2O te"plate 9blog@artigo+3t"l9 no e!ite2. %im, no existe,
mas vamos cri"8lo3
Na pasta da aplicao blog, abra a pasta te"plate, e dentro dela, a pasta blog.
Crie !m novo ar!ivo c&amado 9artigo+3t"l9 e escreva o seg!inte cdigo dentro:
<htm)=
<body=
F)og do #)atazan
<h2=77 artigo.tit()o 99</h2=
77 artigo.$onte(do 99
</body=
</htm)=
Agora volte ao navegador, at!ali#e a p"gina com !m => ve2a o !e tem:

6G
Rom, acontece! algo errado a!i, noJ De2a !e no ar!ivo do template, ns
indicamos as vari"veis FF artigo+titulo GG e FF artigo+conteudo GG para exibirem
respectivamente o ttulo e o contedo do artigo. *as t!do o !e aparece! foi >Rlog
do Alata#an>. 4or!J
4or!e para as vari"veis informadas serem v"lidas, preciso !e alg!m
indi!e !e elas existem, e de onde elas vm.
As vari"veis v"lidas para os templates so indicadas a !ma parte Soc!ltaS do
processo, c&amada Conte!to. 4ara indicar a vari"vel artigo para o contexto deste
template, vamos modificar a $ie8. 4ortanto, na pasta da aplicao blog, abra o
ar!ivo $ie8+p, para edio e o modifi!e, para ficar da seg!inte forma:
from d0ango.short$(ts import render_to_response
from mode)s import #rtigo
def artigo*re8(est- artigo_id+:
artigo ! #rtigo.ob0e$ts.get*id!artigo_id+
ret(rn render_to_response*"b)og/artigo.htm)"- )o$a)s*++
%alve o ar!ivo. <ec&e o ar!ivo. Dolte ao navegador, e... 3a?an
?H
4ronto. 9emos !ma p"gina para o artigo.
*as antes de terminarmos o capt!lo, falta fa#er !ma coisa importante: dei!ar o
na$egador aber Hue o noo blog fornece RSS.
4ara fa#er isso, na pasta da aplicao blog, carreg!e a pasta te"plate e dali a
pasta blog. Abra o ar!ivo artigo/arc3i$e+3t"l para edio, e modifi!e, para
ficar assim:
<htm)=
<head=
<)ink re)!Ga)ternateG type!Gapp)i$ation/rssE1m)G tit)e!G>)timos
artigos do #)atazanG href!G/rss/()timos/G /=
</head=
<body=
<h2=Me( b)og</h2=
7A for artigo in )atest A9
<hH=77 artigo.tit()o 99</hH=
77 artigo.$onte(do 99
7A endfor A9
?K
</body=
</htm)=
%alve o ar!ivo. <ec&e o ar!ivo. D" ao navegador e carreg!e a p"gina principal
de nosso site:
http://)o$a)host:?333/
A res!ltado ser" este:
Abserve o cone do RSS na barra de endereo.
=ec3ando o dia co" abor de de$er cu"prido
Cara, d" pra ver s!a empolgao... pego! t!doJ 8 disse Cartola tambm
agitado.
: fascinante3 Com essa a!lin&a de &o2e, ol&a s o !e e! aprendi:
*!dar o f!so &or"rio do pro2eto
*!dar a ordenao dos artigos
1ar !m valor a!tom"tico para a data do artigo
Adicionar !ma aplicao de contrib
Criar a 7$+ do $%%
Criar a classe de <eed do $%%
?O
Criar as templates para o tt!lo e a descrio dos artigos no $%%
Criar a :R7 e a $ie8 do artigo e s!a template
*!dar a 7$+ padro do site
@nformar vari"veis ao contexto do template
<a#er o cone do $%% aparecer no navegador
e...
Calma3 Doc vai ter !m ata!e a!i &ein... 8 interferi! 1ena 8 s no v" se
es!ecer de !e no P,t3onA edentao correta obrigao vi!... no v"
es!ecer a!ele espao va#io = es!erda, seno pau na certa. 9rocar espao
por 9AR tambm fria...
As dois cora(es de Alata#an p!lsavam forte e os trs caram na gaitada, rindo
da sit!ao.
Al&a, vamos cada !m pra s!a casa !e agora e! vo! dar !ma volta por a.
0sse blog est" fen&o !e di, aman& vamos dar u" (eito no $iual dele.
Cartola disse isso e 2" foi a2eitando a ro!pa pra seg!ir com a s!a vida.
?Q
Captulo B: =a?endo a apreentao do ite co"
te"plate
Alata#an levanto! cedin&o, corre! at a geladeira e
b!sco! !m doce de goiaba. A!ilo era m!ito bom e ele
devorava cada pedacin&o, como se fossem os deliciosos
lagartos !e vendem nas panificadoras de s!a cidade
natal.
0le ligo! a 9D. %empre ac&o! m!ito engraada
a!ela forma primitiva de entretenimento.
No programa ed!cativo da!ela man&, estavam
apresentando como f!nciona a lin&a de fabricao e
montagem de a!tomveis.
.!al!er !m sabe 8 isso, a!i na 9erra, claro 8 !e !m a!tomvel movido pela
fora de se! motor, !e fa# !m ,o! ambos- de se!s eixos girar, e isso fa# as rodas
levarem o carro = frente. ;" diversas o!tras partes f!ndamentais em !m vec!lo, e
elas so compostas !ma por !ma, at !e no fim da lin&a de montagem, passam a
ser feitos a2!stes, pint!ras e encaixes com !m propsito tambm m!ito importante:
o conforto do "otorita e o $iual do carro.
No &" nada de agrad"vel em dirigir !m a!tomvel com cadeiras de ferro o!
observar !m carro sem os devidos acabamentos.
A sit!ao do blog de Alata#an mais o! menos essa: funciona "a et% longe
de er u"a bele?a.
#nto $a"o trabal3ar no te"plateI
7m dos elementos mais importantes do 12ango, se! sistema de templates. 0le
poss!i !ma forma pec!liar de trabal&ar !e facilita m!ito a criao da apresentao
de s!as p"ginas, mas os caras !e criaram o 12ango fi#eram !esto !e esse
trabal&o no se mist!re a o!tras coisas, o! se2a, no intereante tra?er para
dentro do te"plate aHuilo Hue de$eria ter ido feito no cJdigo da $ie8.
?5
*as c&ega de conversa e vamos ao !e interessa3
Antes de mais nada, exec!te o se! pro2eto, clicando d!as ve#es no ar!ivo
e!ecutar+bat da pasta do pro2eto ,"eu/blog-.
No navegador, carreg!e a p"gina inicial:
http://)o$a)host:?333/
Abserve por alg!ns seg!ndos:
Coc6 le$aria a rio u" ite ai"& Alata#an tambm no.
0nto vamos criar !m CSS para mel&orar isso.
C%% significa Cacading St,le S3eet.
4or alg!ma ra#o mrbida, Alata#an se lembro! da sociedade $%% de 'atara,
!e se refere a S$arams %arabinis %aradosS. A significado do nome dessa sociedade
conservadora e rison&a no era con&ecido nem mesmo por se!s seg!idores, 2" !e
era conservada da mesma forma ,e por sinal desorgani#ada- &" tantos milnios !e
o significado se perde! por l".
Alata#an volto! s!a ateno ao C%% e noto! !e isso no tin&a nada a ver com
a!ilo. 0 prosseg!i!.
Aproveitando o devaneio de Alata#an, a partir de agora, para facilitar a nossa
com!nicao, vamos !sar o camin&o de pastas de forma mais compacta, certoJ
4artindo da pasta do pro2eto ,"eu/blog-, em blog@te"plate@blog abra o
ar!ivo artigo/arc3i$e+3t"l, e o modifi!e de forma !e fi!e assim:
<htm)=
?6
<head=
<tit)e=F)og do #)atazan</tit)e=
<)ink re)!Ga)ternateG type!Gapp)i$ation/rssE1m)G tit)e!G>)timos
artigos do #)atazanG href!G/rss/()timos/G /=
<sty)e type!Gte1t/$ssG=
body 7
font,fami)y: aria)I
ba$kgro(nd,$o)or: greenI
$o)or: whiteI
9
h2 7
margin,bottom: 23p1I
9
hH 7
margin: 3I
ba$kgro(nd,$o)or: @eeeI
padding: Bp1I
font,size: 2.HemI
9
.artigo 7
border: 2p1 so)id b)a$kI
ba$kgro(nd,$o)or: whiteI
$o)or: b)a$kI
9
.$onte(do 7
padding: 23p1I
9
</sty)e=
</head=
??
<body=
<h2=F)og do #)atazan</h2=
7A for artigo in )atest A9
<di6 $)ass!GartigoG=
<hH=77 artigo.tit()o 99</hH=
<di6 $)ass!G$onte(doG=
'(b)i$ado em 77 artigo.p(b)i$a$ao 99<br/=
77 artigo.$onte(do 99
</di6=
</di6=
7A endfor A9
</body=
</htm)=
No navegador, at!ali#e a p"gina com => e ve2a como fico!:
?C
Apa, vis!al 2" mel&oro!3 *as a!ela data de p!blicao... no fico! boa.
A maioria das modifica(es foram estticas, !sando CSS e KT.7.
A exceo foi a data de p!blicao, !e trata8se da referncia
FF artigo+publicacao GG, !e indica !e na!ele l!gar do ;9*+, ser" exibido o
conte/do do atrib!to publicacao da vari"vel artigo. *as ele fico! definitivamente
desagrad"vel.
;" !ma forma de mel&orar isso, !sando !m te"plate filter, c&amado 2date2.
9ro!e o FF artigo+publicacao GG por FF artigo+publicacaoLdate:2d MdMe = MdMe
N2 GG e ve2a como fica:
A trec&o de cdigo !e voc acrescento! , Ldate:2d MdMe = MdMe N2 -, fa# o
seg!inte: recebe !ma data ,o! dataN&ora, como este caso- e fa# o tratamento,
exibindo no seg!inte formato: 2D-' de .OS de '1O2, e retorna esse valor
formato em se! l!gar 8 sem modificar a vari"vel original.
Acontece !e o ms est" em ingls. 0nto isso !er di#er !e o todo o site est"
preparado para trabal&ar na lng!a inglesa, o !e no o caso de Alata#an, !e est"
vivendo no Rrasil.
.udando o idio"a padro do pro(eto
0nto vamos agora editar o ar!ivo etting+p, da pasta do pro2eto para m!dar
isso. 4ois ento, com o ar!ivo etting+p, aberto em se! editor, locali#e o seg!inte
?E
trec&o de cdigo:
L#NJ>#JE_%O.E ! "en,(s"
0 modifi!e, para ficar assim:
L#NJ>#JE_%O.E ! "pt,br"
Como deve ter notado, a m!dana foi de Senglis&8unitedtatesS para
Sport!g!ese8bra#ilS.
%alve o ar!ivo. <ec&e o ar!ivo. Dolte ao navegador, pressione a tecla => e:

4ronto3 Agora estamos falando a mesma lng!a3
1ota: d !ma ol&adin&a na interface de administrao ,
&ttp:NNlocal&ost:EHHHNadminN - para ver !e agora t!do est" em bom port!g!s
brasileiro.
*as ainda assim, a!ela data fico! r!im, pois no poss!i &oras, e fico! !m tanto
b!rocr"tica. Damos fa#er algo mais bacanaJ
Doltando ao ar!ivo do template , artigo/arc3i$e+3t"l - s!bstit!a o trec&o L
date:2d MdMe = MdMe N2 por Lti"eince, salve o ar!ivo e ve2a como fica:
?G
O proble"a co" arHui$o Hue no o :T=PD
A&&, agora est" m!ito mais &!mano 8 em 'atara isso c&amado de SbvioS,
mas enfim, no estamos em 'atara.
*as a ling!agem fico! estran&a, noJ S4!blicado em O dias, 6 &orasS no
assim StoS amig"vel. 4ois ento, no ar!ivo do template, s!bstit!a o e" por 3%.
%alve o ar!ivo. 4orm, possvel !e voc ten&a !m problema agora, ve2a:
%e este mesmo erro for exibido para voc, por!e voc !so! !m editor !e no
salva em formato :nicode por padro. Como o caso do *loco de 1ota.
1essa forma, voc deve ir at o men! 'rHui$o PQ Sal$ar co"o e deixar o
mesmo nome do ar!ivo, m!dando os dois campos abaixo do nome para 2Todo o
arHui$o2 e 2:T=PD2, respectivamente, como est" na imagem abaixo:
CH
Agora, ao retornar ao navegador, ve2a o res!ltado:
4ronto. .!esto dos caracteres especiais resolvida. 1a prxima ve# !e isso
ocorrer, voc 2" sabe como proceder.
CK
Agora observe bem o ar!ivo de template, e voc pode notar o seg!inte trec&o
de cdigo:
7A for artigo in )atest A9
<di6 $)ass!GartigoG=
<hH=77 artigo.tit()o 99</hH=
<di6 $)ass!G$onte(doG=
'(b)i$ado hK 77 artigo.p(b)i$a$ao 99<br/=
77 artigo.$onte(do 99
</di6=
</di6=
7A endfor A9
De2a !e o trec&o iniciado com FR for artigo in latet RG e finali#ado com
FR endfor RG.
9rata8se de !m te"plate tag.
9odos os Te"plate Tag iniciam e terminam com FR e RG respectivamente, e
so mais poderosos !e !al!er o!tro elemento em !m template, pois possvel
trabal&ar com blocos, como o caso desse lao de repetio !e aberto pelo
template tag FR for RG e fec&ado com se! template tag de fec&amento FR endfor
RG.
-ncluindo u" te"plate dentro de outro
Aps a!ele trec&o de cdigo citado acima, acrescente este o!tro trec&o de
cdigo:
7A in$)(de Grodape.htm)G A9
%alve o ar!ivo. <ec&e o ar!ivo. D" ao navegador e at!ali#e com =>. De2a o
res!ltado:
CO
@sso acontece, pois a template tag FR include RG incl!i !m template dentro de
o!tro. *aneiro, no J 0 como esse o!tro template incl!do no existe, ele exibi! a
mensagem de erro.
Damos ento criar esse novo ar!ivo. *as pense comigo: o rodap de u"
te"plate no de$e er retrito ao blogA "a de$e er do ite co"o u" todo,
concordaJ 0nto dessa ve# ns no vamos adicionar esse template = pasta de
templates da aplicao blog.
Na pasta do pro2eto, crie !ma nova pasta, c&amada 2te"plate2 e dentro dela,
crie o ar!ivo 2rodape+3t"l2 com o seg!inte cdigo dentro:
<di6 $)ass!GrodapeG=
'or fa6or nLo faMa $ontato. Obrigado pe)a atenMLo.
</di6=
%alve o ar!ivo. <ec&e o ar!ivo.
Criando u"a pata geral para te"plate do pro(eto
*as s isso no s!ficiente, pois precisamos di#er ao pro2eto !e ele agora
poss!i !ma pasta de templates prpria, o !e no feito a!tomaticamente como
feito para aplica(es. 4ortanto, na pasta do pro2eto, abra o ar!ivo etting+p, para
edio e locali#e o seg!inte trec&o:
TEM'L#TE_.IN& ! *
CQ
@ '(t strings here- )ike G/home/htm)/d0ango_temp)atesG or
@ G%:/www/d0ango/temp)atesG.
@ #)ways (se forward s)ashes- e6en on Oindows.
@ .on"t forget to (se abso)(te paths- not re)ati6e paths.
+
A t!pla T#.P7'T#/D-RS indica as pastas onde podem ser encontrados
templates para o pro2eto, alm da!elas !e 2" so a!tomaticamente locali#adas
dentro das aplica(es. A 12ango no incentiva o !so exagerado dessas pastas
SextraS de templates, pois entendemos !e a maior partes deles deve ser
concentrada em s!as devidas aplica(es, mas em m!itas ve#es inevit"vel poss!ir
alg!ns ar!ivos8c&ave n!ma dessas pastas.
*odifi!e o trec&o de cdigo para ficar assim:
TEM'L#TE_.IN& ! *
"temp)ates"-
+
%alve o ar!ivo.
Agora, ao at!ali#ar se! navegador, o res!ltado ser" este:

No entanto, &" !ma coisa desagrad"vel a!i. A camin&o 9te"plate9 no !m
camin&o absol!to, e isso pode te levar a ter diversos problemas. Damos portanto
C5
fa#er !ma boa pr"tica 2"3 No incio do ar!ivo etting+p,, acrescente as seg!intes
lin&as:
import os
'NOPE%T_NOOT_'#TQ ! os.path.dirname*os.path.abspath*__fi)e__++
Agora, modifi!e a t!pla T#.P7'T#/D-RS para ficar assim:
TEM'L#TE_.IN& ! *
os.path.0oin*'NOPE%T_NOOT_'#TQ-"temp)ates"+-
+
0 no somente isso. +ocali#e esta lin&a:
.#T#F#&E_N#ME ! "me(_b)og.db" @ Or path to database
fi)e if (sing s8)iteR.
0 modifi!e para ficar assim:
.#T#F#&E_N#ME ! os.path.0oin*'NOPE%T_NOOT_'#TQ-"me(_b)og.db"+
@sso fa# com !e esses camin&os de pastas e ar!ivos se2am camin&os
completos, e no somente o se! /nico nome simples.
' te"plate tag FR url RG
4ois agora vamos voltar ao template 2artigo/arc3i$e+3t"l2 e locali#ar a
seg!inte lin&a:
<hH=77 artigo.tit()o 99</hH=
*odifi!e para ficar assim:
<a href!G7
7 artigo.get_abso)(te_(r) 9
9G=
<hH=7
7 artigo.tit()o 9
9</hH=
</a=
@sso fa# com !e o tt!lo do artigo passe a ser !m linL para s!a prpria p"gina.
*as &" ainda !ma forma mel&or de indicar !m linL, !sando a template tag FR url
RG.
0ssa template tag bacana, pois flexvel =s m!danas. 7sando a template tag
FR url RG para indicar !m linL, voc pode modificar o camin&o da 7$+ no
ar!ivo url+p, e no precisa se preoc!par com os v"rios linLs !e existem
espal&ados pelos templates indicando =!ela 7$+, pois eles so a2!stados
C6
a!tomaticamente. 4ortanto, modifi!e o mesmo trec&o de cdigo para ficar assim:
<a href!G
7A (r) b)og.6iews.artigo artigo_id!artigo.id A9G=
<hH=77 artigo.tit()o 99</hH=
</a=
Abservando o !e escrevemos, voc vai notar !e a template tag indica
primeiramente o camin&o da vieM , aplicao blog, ar!ivo $ie8+p,, vieM artigo -
e o arg!mento artigo/id recebendo o cdigo do artigo , artigo+id -.
Derificando a 7$+ em !esto, ve2a se recon&ece as semel&anas:
*r"4artigo/*;'<artigo_id=DdE+/5"- "b)og.6iews.artigo"+-
Noto! o fator de ligaoJ Abserve os elementos blog+$ie8+artigo e artigo/id.
%alve o ar!ivo. <ec&e o ar!ivo. 0 agora, ao carregar a p"gina no navegador
novamente, voc vai notar o linL para a p"gina no artigo.
' 3erana de te"plate
4ois bem, falando na p"gina do artigo, vamos ver como ela est"J
+ocali#e em se! navegador a seg!inte 7$+:
http://)o$a)host:?333/artigo/2/

Como pode ver, a m!dana vis!al !e fi#emos no template da p"gina inicial no
afeto! em nada a p"gina do artigo. @sso ocorre por!e de fato os dois templates so
distintos. *as existe !ma sol!o pra isso3
No conceito de Progra"ao Orientada a Ob(eto &" dois elementos
importantes, e alg!mas ve#es conflitantes, c&amados 3erana e co"poio. No
sistema de templates do 12ango, voc pode trabal&ar com ambos os conceitos,
adotando o mais ade!ado para cada sit!ao.
Ns 2" trabal&amos o conceito de co"poio l" atr"s, !ando voc con&ece! a
template tag FR include RG, !e trabal&a na idia de compTr !m template
acrescentando o!tros templates de fim especfico ,como apresentar to somente !m
rodap, por exemplo- como parte dele.
Agora ento vamos fa#er !so da 3erana.
A conceito de &erana trata8se de concentrar !ma parte generali?ada em !m
template !e ser" 3erdado por o!tros, o! se2a, estes o!tros sero !ma cpia
da!ele, modificando as partes !e assim o dese2arem. @sso "uito til para se
evitar re8trabal&o na constr!o de laBo!ts de p"ginas.
C?
4ois ento vamos ao trabal&o.
Na pasta 2te"plate2 do pro(eto , "eu/blog@te"plate -, crie !m novo
ar!ivo, c&amado 2bae+3t"l2, e escreva o seg!inte cdigo dentro:
<htm)=
<head=
<tit)e=
7A b)o$k tit()o A9F)og do #)atazan7A endb)o$k A9
</tit)e=
<)ink
re)!Ga)ternateG
type!Gapp)i$ation/rssE1m)G
tit)e!G>)timos artigos do #)atazanG
href!G/rss/()timos/G
/=
<sty)e type!Gte1t/$ssG=
body 7
font,fami)y: aria)I
ba$kgro(nd,$o)or: greenI
$o)or: whiteI
9
h2 7
margin,bottom: 23p1I
9
hH 7
margin: 3I
ba$kgro(nd,$o)or: @eeeI
padding: Bp1I
font,size: 2.HemI
9
.artigo 7
border: 2p1 so)id b)a$kI
CC
ba$kgro(nd,$o)or: whiteI
$o)or: b)a$kI
9
.$onte(do 7
padding: 23p1I
9
</sty)e=
</head=
<body=
<h2=7A b)o$k h2 A9F)og do #)atazan7A endb)o$k A9</h2=
7A b)o$k $onte(do A97A endb)o$k A9
7A in$)(de Grodape.htm)G A9
</body=
</htm)=
Doc pode notar !e se trata do mesmo cdigo ;9*+ !e fi#emos no template
2artigo/arc3i$e+3t"l2, com alg!mas modifica(es. 0 essas modifica(es foram a
remoo de partes do cdigo !e eram especficas da!ela p"gina ,!ma listagem de
artigos-, e a criao de "reas potencialmente modific"veis. 0ssas "reas so as
template tags FR bloc4 RG.
A template tag FR bloc4 RG indica !e na!ele espao aberto por FR bloc4
RG e fec&ado por FR endbloc4 RG, os templates !e &erdarem este pode" fa?er
"udana ade!adas = s!a realidade.
%alve o ar!ivo. Damos agora voltar a editar o template 2artigo/arc3i$e+3t"l2,
da pasta blog@te"plate@blog e modificar para todo o ar!ivo ficar assim:
7A e1tends Gbase.htm)G A9
7A b)o$k $onte(do A9
7A for artigo in )atest A9
<di6 $)ass!GartigoG=
CE
<a href!G
7A (r) b)og.6iews.artigo artigo_id!artigo.id A9G=
<hH=77 artigo.tit()o 99
</hH=
</a=
<di6 $)ass!G$onte(doG=
'(b)i$ado hK 77 artigo.p(b)i$a$aoStimesin$e 99<br/=
77 artigo.$onte(do 99
</di6=
</di6=
7A endfor A9
7A endb)o$k A9
4!xa3 1imin!i! bastante, no foiJ
%im, e o !e fi#emos foi exatamente o oposto do template bae+3t"l:
removemos as partes generali#adas e levadas para o template &erdado e deixamos
somente as partes especficas desse template.
Note a template tag FR e!tend 2bae+3t"l2 RG no incio do template. : ela
!em di# !e este template ser" !ma e!teno da!ele !e criamos , bae+3t"l -.
0ssa template tag deve sempre estar posicionada no incio do template.
A partir do momento em !e !m template extende o!tro, HualHuer cJdigo Hue
eti$er fora de !ma template tag FR bloc4 RG ser" ignorado. 4ortanto, ve2a !e o
trec&o de cdigo especfico desse template foi colocado dentro do bloco FR bloc4
conteudo RG.
As demais blocos no foram declarados o! citados por!e nesta p"gina no
precisamos modific"8los.
%alve o ar!ivo. <ec&e o ar!ivo. 0 ao at!ali#ar o navegador com =>, verifi!e
!e o vis!al da p"gina inicial permanece o mesmo.
Agora vamos fa#er o mesmo trabal&o no template artigo+3t"l da pasta
blog@te"plate@blog. Abra esse ar!ivo para edio e modifi!e para ficar assim:
7A e1tends Gbase.htm)G A9
7A b)o$k tit()o A977 artigo.tit()o 99 ,
77 b)o$k.s(per 997A endb)o$k A9
CG
7A b)o$k h2 A977 artigo.tit()o 997A endb)o$k A9
7A b)o$k $onte(do A9
77 artigo.$onte(do 99
7A endb)o$k A9
De2a !e extendemos o mesmo template de &erana , bae+3t"l -. *as desta ve#
declaramos os o!tros blocos, pois precis"vamos m!dar se!s conte/dos.
A caso do bloco FR bloc4 titulo RG especial, pois ele poss!i !m elemento
bastante /til a!i, o FF bloc4+uper GG.
A FF bloc4+uper GG !ma vari"vel !e carrega o conte/do do bloco no template
&erdado, e !ando ele informado, isso significa !e na!ele l!gar deve ser
mantido o conte/do do bloco original. A! se2a, ns m!damos o ttulo da p"gina,
mas mantivemos o original, apenas acrescentando = es!erda o trec&o adicional !e
!eramos.
Agora salve o ar!ivo. <ec&e o ar!ivo. D" at o navegador e ve2a o res!ltado:

Iosto! do res!ltadoJ
Agora podemos representar a &erana e composio dos nossos templates da
seg!inte forma:
EH

'goraA partindo para eparar a coia+++
%e e! gosteiJ *as claro, isso fascinante, logo logo vo! poder colocar me!
blog no ar e...
N!m r"pido relance, Alata#an interrompe! se! disc!rso ao ver !m v!lto passar
pela 2anela. 0le no identifico! a!ele movimento r"pido, mas algo l&e lembro!
da!ela ve# !e &avia con&ecido Rall#er, na praa prxima de s!a casa, em 'atara.
0le coo! a cabea e percebe! !e 2" era tarde. A empolgao o manteve ligado
nas explica(es de Cartola e Nena e agora era a &ora de voltar rapidamente para
casa. 1e o!tra forma, poderia perder a a!la de xadre# da!ele dia.
Alata#an, leve esse livro com voc, vai te a2!dar a pegar alg!ns lances mais
com!ns de )adre# 8 Nena pego! !m livro na estante e entrego! a ele. 8 voc vai
notar !e cada pea tem !ma dinFmica diferente, e alg!mas delas nem se pode
c&amar de dinFmica, de to limitadas !e so... mas cada !ma c!mpre o se!
papel.
Alata#an agradece! com !m gesto tpico de 'atara e se despedi!.
No prximo capt!lo vamos separar alg!mas coisas do template, aplicar imagens
e con&ecer !m po!co mais sobre como fa#er isso.
EK
Captulo D: Trabal3ando co" arHui$o et%tico
A !e sensibili#a Alata#an desde !e c&ego! = 9erra
!e ns &!manos poss!mos !ma virt!de !e tambm
importante em 'atara. %eres orgFnicos poss!em
indi$idualidade.
Cada flor, mesmo sendo da mesma espcie e da
mesma planta, poss!i !m taman&o diferente, !m tom
de cor partic!lar. 8 di#ia ele consigo mesmo en!anto
tomava !m sorvete na praa.
A sorvete cai! no c&o e balano! a cabea. *as
contin!o!:
Cada pessoa tem !m 2eito diferente de agir, !ma importFncia partic!lar para o
todo, e tratar a todos como se fossem ig!ais seria desperdiar o !e cada !m tem
de mel&or...
Agora !m o! dois pombos mexiam no sorvete espal&ado pelo c&o.
<ilosofias = parte, Alata#an se levanto! e seg!i! para a casa de Cartola.
Damos l" me! amigo, &o2e dia de est!dar o!tra pea importante na
engrenagem do site
O arHui$o et%tico
7m site no se res!me a p"ginas em ;9*+. 0le tambm poss!i imagens,
ar!ivos C%%, Uava%cript, <las& e o!tros formatos diversos.
*as &" !ma diferena f!ndamental entre !mas e o!tras partes do site, e isso no
restrito ao tipo de conte/do !e ser" enviado para o navegador, e sim a como
a!ele conte/do se comporta no site.
0le dinS"ico o! et%ticoJ
A p"gina inicial do blog apresenta !m res!ltado diferente a cada ve# !e
criado !m novo artigo. %e! conte/do poderia variar tambm dependendo do !s!"rio
EO
!e est" a!tenticado na!ela &ora. 0ssa !ma p"gina dinS"ica.
U" a foto sorridente de Alata#an no canto s!perior es!erdo do site, ser" a
mesma at !e alg!m s!bstit!a o ar!ivo por o!tro. 0nto, ela et%tica.
*as !e fotoJ No &" nen&!ma foto por l". 0nto isso !e vamos fa#er.
Antes de mais nada, no se es!ea de exec!tar o pro2eto no 12ango, clicando
d!as ve#es sobre o ar!ivo e!ecutar+bat da pasta do pro2eto.
Agora abra o ar!ivo de template artigo/arc3i$e+3t"lA da pata
TTblog@te"plate@blog para edio, e locali#e a seg!inte lin&a:
7A b)o$k $onte(do A9
Agora acrescente a seg!inte lin&a abaixo dela:
<img sr$!G77 ME.I#_>NL 99foto.0pgG/=
%alve o ar!ivo. <ec&e o ar!ivo. 0ssa tag ;9*+ vai exibir !ma imagem
c&amada foto+(pg no camin&o apontado pela varavel FF .#D-'/:R7 GG.
A vari"vel FF .#D-'/:R7 GG contm o mesmo valor contido na etting
.#D-'/:R7.
0nto vamos agora abrir o ar!ivo eting+p, da pasta do pro2eto para edio, e
locali#ar esta setting:
ME.I#_>NL ! ""
A setting .#D-'/:R7 tem a f!no de indicar o endereo !e contm
arHui$o et%tico do pro2eto.
@sso no indica !e se2a possvel ter apenas !m. 0m grandes pro2etos
necess"rio &aver mais camin&os para ar!ivos est"ticos, ento so tomados o!tras
pr"ticas para isso. *as sempre !e possvel, recomend"vel ter apenas !m l!gar
!e fornea esses ar!ivos. 0 o camin&o mais indicado o @"edia@. 4ortanto,
modifi!e essa lin&a para ficar assim:
ME.I#_>NL ! "/media/"
*as s isso no s!ficiente. +ocali#e a setting .#D-'/ROOT e ve2a como
est":
ME.I#_NOOT ! ""
0sta setting indica o camin&o no ;1 onde esto os ar!ivos est"ticos.
*odifi!e esta setting para ficar assim:
ME.I#_NOOT ! os.path.0oin*'NOPE%T_NOOT_'#TQ- "media"+
Doc deve ser lembrar de !e 2" !samos essa f!no o+pat3+(oin;< com a
setting PROU#CT/ROOT/P'TK no mesmoJ 0 ela retorna para a setting
.#D-'/ROOT o camin&o completo para a pasta do pro2eto , "eu/blog - somada
EQ
com a s!bpasta "edia.
0 por fim, ainda temos !ma coisa para fa#er. +ocali#e a setting
'D.-1/.#D-'/PR#=-V e ve2a como est":
#.MIN_ME.I#_'NE/IT ! "/media/"
0sta setting indica o camin&o para os ar!ivos est"ticos do 'd"in 8 a interface
a!tom"tica de administrao do 12ango. Acontece !e ela est" apontando
exatamente para o mesmo camin&o !e a setting .#D-'/:R7 e isso vai dar em
conflito. 0nto a modifi!e para ficar assim:
#.MIN_ME.I#_'NE/IT ! "/admin_media/"
Doc deve estar se perg!ntando 2"a e eta o a "el3ore pr%ticaA ento
porHu6 ea etting (% no $6" dea for"a&2. A&n... "el3ore pr%tica !ma
expresso m!ito forte. 0 este ass!nto trata de varia(es diversas em pro2etos
distintos. 1igamos !e estas se2am as mel&ores pr"ticas para sites pe!enos o! sites
em desenvolvimento. *as ainda assim no so as /nicas boas pr"ticas para isso.
4ortanto, o 12ango tenta ser o mais discreto possvel, deixando essa deciso para
voc.
%alve o ar!ivo. <ec&e o ar!ivo.
Ac&a !e s issoJ No . A camin&o !e indicamos = setting .#D-'/:R7
no existe no ar!ivo url+p, e como este !m a"biente de deen$ol$i"ento,
temos isso a fa#er ali: abrir o ar!ivo url+p, para edio e adicionar a seg!inte
7$+:
*r"4media/*.:+5"- "d0ango.6iews.stati$.ser6e"-
7"do$(ment_root": settings.ME.I#_NOOT9+-
Noto! !e fi#emos a ligao entre as settings .#D-'/:R7 e
.#D-'/ROOTJ A seg!nda d" s!porte = primeira.
*as o elemento etting+.#D-'/ROOT ali no vai f!ncionar, pois preciso
di#er !em o 2etting2 em !esto. 4ortanto, locali#e a seg!inte lin&a no
ar!ivo:
from d0ango.$onf.(r)s.defa()ts import :
0 adicione abaixo dela:
from d0ango.$onf import settings
Agora o ar!ivo url+p, fico! assim:
from d0ango.$onf.(r)s.defa()ts import :
from d0ango.$onf import settings
@ >n$omment the ne1t two )ines to enab)e the admin:
E5
from d0ango.$ontrib import admin
admin.a(todis$o6er*+
from b)og.mode)s import #rtigo
from b)og.feeds import >)timos#rtigos
(r)patterns ! patterns*""-
*r"45"- "d0ango.6iews.generi$.date_based.ar$hi6e_inde1"-
7"8(eryset": #rtigo.ob0e$ts.a))*+-
"date_fie)d": "p(b)i$a$ao"9+-
*r"4admin/*.:+"- admin.site.root+-
*r"4rss/*;'<(r)=.:+/5"-
"d0ango.$ontrib.syndi$ation.6iews.feed"-
7"feed_di$t": 7"()timos": >)timos#rtigos99+-
*r"4artigo/*;'<artigo_id=DdE+/5"- "b)og.6iews.artigo"+-
*r"4media/*.:+5"- "d0ango.6iews.stati$.ser6e"-
7"do$(ment_root": settings.ME.I#_NOOT9+-
+
%alve o ar!ivo. <ec&e o ar!ivo.
4ronto, 2" temos a 7$+ f!ncionando. *as agora precisamos ter !ma pasta
2"edia2 na pasta do pro2eto, com o ar!ivo foto+(pg dentro, certoJ
0nto v" at a pasta do pro2eto e crie a pasta "edia.
A foto do Alata#an esta:

Doc pode !s"8la, baixando da seg!inte 7$+:
http://www.aprendendod0ango.$om/ga))ery/foto,de,a)atazan/fi)e/
A! pode !sar !ma foto s!a. Como preferir. A !e importa !e essa imagem
deve ser do formato UP#G, o nome do ar!ivo deve ser 2foto+(pg2, e deve ser
E6
colocada na pasta "edia. @sso por!e este o endereo indicado pela tag ;9*+
desta imagem, l" no template.
<eito isso, agora temos a imagem da foto do Alata#an, devidamente salva na
pasta correta e com as todas referncias finali#adas. Damos ao navegadorJ 4ois
bem, locali#e no se! navegador a 7$+ principal do blog:
http://)o$a)host:?333/
0 ve2a o res!ltado:
Racana3 Agora temos !ma imagem posicionada em nosso laBo!t3
: possvel !e &a2a !ma d/vida em s!a cabea agora: 2"a o D(ango J
uporta i"agen UP#G&2
No. isso no est" sob poder do 12ango. A 12ango s!porta !al!er imagem o!
o!tro formato de ar!ivo est"tico, se2a ele %&ocLMave <las& ,.sMf-, imagens ,.gif,
.2pg, .png e o!tras-, mdia digital ,.mpQ, .Mma, .ogg e o!tras-, Uava%cript ,.2s-, C%%
,.css- o! !al!er o!tro formato de ar!ivo et%tico. 0ssa !ma definio !e no
depende do 12ango, mas sim de se! servidor e navegador !e vo trabal&ar com
esses ar!ivos.
Agora vamos fa#er o!tra modificao: separar o CSS do template, e criar !m
ar!ivo est"tico para conter somente o C%%. DamosJ
E?
Na pasta do pro2eto, abra a pasta te"plate. Nesta pasta, abra o ar!ivo
bae+3t"l para edio, e s!bstit!a o seg!inte trec&o de cdigo:
<sty)e type!Gte1t/$ssG=
body 7
font,fami)y: aria)I
ba$kgro(nd,$o)or: greenI
$o)or: whiteI
9
h2 7
margin,bottom: 23p1I
9
hH 7
margin: 3I
ba$kgro(nd,$o)or: @eeeI
padding: Bp1I
font,size: 2.HemI
9
.artigo 7
border: 2p1 so)id b)a$kI
ba$kgro(nd,$o)or: whiteI
$o)or: b)a$kI
9
.$onte(do 7
padding: 23p1I
9
</sty)e=
4or este:
<)ink re)!Gsty)esheetG type!Gte1t/$ssG
href!G77 ME.I#_>NL 99)ayo(t.$ssG/=
Agora o nosso template base.&tml fico! assim:
EC
<htm)=
<head=
<tit)e=
7A b)o$k tit()o A9F)og do #)atazan7A endb)o$k A9
</tit)e=
<)ink
re)!Ga)ternateG
type!Gapp)i$ation/rssE1m)G
tit)e!G>)timos artigos do #)atazanG
href!G/rss/()timos/G
/=
<)ink re)!Gsty)esheetG type!Gte1t/$ssG
href!G77 ME.I#_>NL 99)ayo(t.$ssG/=
</head=
<body=
<h2=7A b)o$k h2 A9F)og do #)atazan7A endb)o$k A9</h2=
7A b)o$k $onte(do A97A endb)o$k A9
7A in$)(de Grodape.htm)G A9
</body=
</htm)=
%alve o ar!ivo. <ec&e o ar!ivo. 0 ve2a como fico!:
EE
Apa3 4arece !e perdemos o nosso vis!al verde bandeira3 %im, mas vamos
agora criar o ar!ivo de C%% para voltar ao normal.
Na pasta 2"edia2 do pro2eto, crie !m ar!ivo c&amado 2la,out+c2 e escreva
o seg!inte cdigo dentro:
body 7
font,fami)y: aria)I
ba$kgro(nd,$o)or: greenI
$o)or: whiteI
9
h2 7
margin,bottom: 23p1I
9
hH 7
margin: 3I
ba$kgro(nd,$o)or: @eeeI
padding: Bp1I
EG
font,size: 2.HemI
9
.artigo 7
border: 2p1 so)id b)a$kI
ba$kgro(nd,$o)or: whiteI
$o)or: b)a$kI
9
.$onte(do 7
padding: 23p1I
9
Noto! !e exatamente o mesmo !e removemos do template bae+3t"l,
exceto pela a!sncia das tags Wt,leQJ
4ois agora salve o ar!ivo. <ec&e o ar!ivo. Dolte ao navegador e ve2a !e o
vis!al do site volto! ao normal:
Agora, v" novamente = p"gina do artigo, no navegador, na seg!inte 7$+:
GH
http://)o$a)host:?333/artigo/2/
A res!ltado ser" o seg!inte:
Apa3 Ande foi parar o estilo C%% desta p"ginaJ
Acontece !e esta p"gina vem !e !ma $ie8 !e foi feita man!almente por
voc, e esta no poss!i !m conte!to !e conten&a !m valor para a vari"vel
FF .#D-'/:R7 GG, e isso fe# com !e s!a referncia ficasse va#ia, perdendo se!
estilo.
*ais pra frente vamos ver isso em detal&es, mas agora, vamos nos atentar e
resolver o problema.
Na pasta da aplicao 2blog2, abra o ar!ivo $ie8+p, para edio, e modifi!e
o ar!ivo para ficar da seg!inte forma:
from d0ango.short$(ts import render_to_response
from d0ango.temp)ate import Ne8(est%onte1t
from mode)s import #rtigo
def artigo*re8(est- artigo_id+:
artigo ! #rtigo.ob0e$ts.get*id!artigo_id+
ret(rn render_to_response*"b)og/artigo.htm)"- )o$a)s*+-
$onte1t_instan$e!Ne8(est%onte1t*re8(est++
A !e ns fi#emosJ Ns acrescentamos a seg!inte lin&a:
GK
from d0ango.temp)ate import Ne8(est%onte1t
0 modificamos esta o!tra:
ret(rn render_to_response*"b)og/artigo.htm)"- )o$a)s*+-
$onte1t_instan$e!Ne8(est%onte1t*re8(est++
0ssas modifica(es fa#em com !e alg!mas vari"veis especiais ,incl!indo a
FF .#D-'/:R7 GG- se2am v"lidas nos templates.
%alve o ar!ivo. <ec&e o ar!ivo. D" ao navegador, at!ali#e com => e ve2a o
res!ltado:
4ronto3 Agora sim, o problema foi resolvido.
De u" e!tre"o ao outro: do et%tico para a p%gina planaI
A tempo passo! voando e Alata#an 2" estava c!rioso em con&ecer ferramentas
para a criao de imagens: o -n4cape e o Gi"p. 0ssas d!as ferramentas so
fant"sticas para a criao de imagens para sites. Nena 2" &avia comentado sobre
elas.
*as ele no !is perder o foco, e comento! com o dono da casa:
Rom, &o2e foi bem diferente...
*as !ma parte m!ito, m!ito importante do site, Alata#an. No existem sites
sem C%% e imagens, o! pelo menos no existem bon sites sem eles 8
GO
interrompe! Nena, m!ito enf"tica 8 e este !m ponto bem conf!so, =s ve#es...
%im, mesmo... !m po!co conf!so. *as depois !e voc aprende,
simples entender !e:
: preciso a2!star as settings .#D-'/:R7, .#D-'/ROOT e
'D.-1/.#D-'/PR#=-V
A setting .#D-'/:R7 !ma 7$+ para a pasta .#D-'/ROOT
: preciso criar a pasta "edia na pasta do pro2eto
: preciso criar a 7$+ X"edia@
9oda referncia a ar!ivos est"ticos nos templates devem iniciar com
FF .#D-'/:R7 GG
*!ito bom, m!ito bom3 8 foi a ve# de Cartola.
Agora !e ten&o a min&a foto na p"gina principal, e! esto! sentindo falta de
!m l!gar para falar !em so! e!, e alg!ma informao a mais...
%im. Damos fa#er assim: aman& vamos est!dar sobre P%gina Plana, pra
isso !e elas servem3 Agora vamos embora !e o calor est" nos convidando pra
!m passeio l" na r!a.
GQ
Captulo Y: P%gina de contedo o =latPage
<ol&eando o livro de )adre# !e Nena l&e
empresto!, Alata#an noto! a!elas se(es de
informa(es do livro, como !ma breve biografia do
a!tor, na contracapa, e a p"gina onde &aviam se!s
agradecimentos. Na /ltima p"gina do livro &avia
tambm !m texto promocional de o!tros livros do
mesmo a!tor, s!a fotografia e !m carto da lo2a onde o
livro &avia sido comprado.
: com!m &aver esse tipo de p"ginas na maior parte dos sites.
@sso por! voc precisa di#er !em , do !e se trata e o!tros ass!ntos
relacionados para dar solide# e demonstrar transparncia ao se! !s!"rio. %e! legado
importante.
Co"o u"a lu$a: a P%gina Plana
4ara p"ginas de conte/do simples assim, as =latPage 8 o! trad!#indo 8 as
2P%gina Plana2, encaixam8se como l!vas, pois no necess"rio saber programar
em 12ango para cri"8las, basta !e o programador ten&am &abilitado esse rec!rso e
criado !m template para isso e todo o resto pode ser feito pelo 'd"in 8 a interface
de administrao do 12ango.
Damos logo colocar a mo na massa, pois no precio "uito eforo para
c&egar ao final da lio de &o2e.
Antes de t!do, inicie se! pro2eto clicando d!as ve#es no ar!ivo e!ecutar+bat.
Agora abra a pasta do pro2eto, e edite o ar!ivo etting+p, para adicionar a
aplicao flatpage ao pro2eto e se! middleMare.
<aa assim: v" at o final do ar!ivo, na setting -1ST'77#D/'PPS e adicione
a seg!inte lin&a:
"d0ango.$ontrib.f)atpages"-
Com isso, o trec&o de cdigo dessa setting fico! assim:
G5
IN&T#LLE._#''& ! *
"d0ango.$ontrib.a(th"-
"d0ango.$ontrib.$ontenttypes"-
"d0ango.$ontrib.sessions"-
"d0ango.$ontrib.sites"-
"d0ango.$ontrib.admin"-
"d0ango.$ontrib.syndi$ation"-
"d0ango.$ontrib.f)atpages"-
"b)og"-
+
Agora vamos adicionar o "iddle8are Hue fa? todo o trabal3o "%gico das
<lat4ages. +ocali#e a setting .-DD7#Z'R#/C7'SS#S ainda no ar!ivo
etting+p, e adicione a seg!inte lin&a:
"d0ango.$ontrib.f)atpages.midd)eware./)atpage/a))ba$kMidd)eware"-
Agora o trec&o de cdigo da setting .-DD7#Z'R#/C7'SS#S fico! assim:
MI..LEO#NE_%L#&&E& ! *
"d0ango.midd)eware.$ommon.%ommonMidd)eware"-
"d0ango.$ontrib.sessions.midd)eware.&essionMidd)eware"-
"d0ango.$ontrib.a(th.midd)eware.#(thenti$ationMidd)eware"-
"d0ango.$ontrib.f)atpages.midd)eware./)atpage/a))ba$kMidd)eware"-
+
%alve o ar!ivo. <ec&e o ar!ivo.
Agora vamos gerar o banco de dados para ver o efeito !e isso ca!so! em nosso
pro2eto. Na pasta do pro2eto, cli!e d!as ve#es sobre o ar!ivo
gerar/banco/de/dado+bat !e deve exec!tar da seg!inte forma:

G6
Com o banco de dados gerado, podemos abrir o navegador na 7$+ do admin:
http://)o$a)host:?333/admin/
0 temos agora !ma nova seo para P%gina Plana:
Cli!e no linL 2'dicionar2 = direita da palavra 2P%gina Plana2 e adicione
!ma nova 7$+ da seg!inte forma:
G?
... e ao rolar a barra de rolage", ainda &" este o!tro campo para informar:

A! se2a, informe os seg!intes valores para os respectivos campos:
7$+: @obreP"i"@
9t!lo: Sobre "i"
Conte/do: ete(a li$re para infor"ar o te!to co"o HuierA "a faa
Hueto Hue ee te!to ten3a "ai de u"a lin3a
%ites: local3ot:DEEE
7ma informao importante a!i: no e eHuea da barra , N - no incio e no
final do ca"po :R7. @sso importante para !e o middleMare consiga casar a
7$+ com a <lat4age, oLJ
4ois bem, agora cli!e sobre o boto 2Sal$ar2 e carreg!e no navegador o
seg!inte endereo:
http://)o$a)host:?333/sobre,mim/
0 ve2a o res!ltado a seg!ir:
GC
Apa3 9emos !m erro a!i3
*as simples: para u"a =latPage funcionarA nece%rio 3a$er u"
te"plate onde ela er% 2encai!ada2.
4ortanto, vamos agora = pasta do pro2eto e abrir dali a pasta 2te"plate2.
1entro da pasta 2te"plate2, crie !ma nova pasta, c&amada 2flatpage2. 1entro
da nova pasta, crie o ar!ivo 2default+3t"l2. Abra8o para edio e escreva o
seg!inte cdigo dentro:
7A e1tends Gbase.htm)G A9
7A b)o$k tit()o A977 f)atpage.tit)e 99 ,
77 b)o$k.s(per 997A endb)o$k A9
7A b)o$k h2 A977 f)atpage.tit)e 997A endb)o$k A9
7A b)o$k $onte(do A9
GE
77 f)atpage.$ontent 99
7A endb)o$k A9
%alve o ar!ivo. Dolte ao navegador e pressione a tecla => para at!ali#ar. De2a
como fico!:

1ifcilJ 7ma baba3 *as &" !ma coisa feia ali. +embra8se de !e escrevemos !m
texto com dua lin3aJ %im, mas elas se transformaram em !ma s... mas o !e
acontece!J
A resposta simples: o ;9*+ gerado para textos com salto de lin&a ignora
esses saltos de lin&a a menos !e &a2a a tag ;9*+ Wbr@Q entre elas. *as o 12ango
m!ito legal, ento &" !ma sol!o mais amig"vel para isso.
Dolte ao ar!ivo de template !e acabamos de criar e locali#e a seg!inte lin&a:
77 f)atpage.$ontent 99
Agora a modifi!e para ficar assim:
77 f)atpage.$ontentS)inebreaks 99
%alve o ar!ivo. <ec&e o ar!ivo. D" ao navegador, at!ali#e a p"gina e ve2a
como fico!:

GG
4ronto3 =latPage so isso !e voc acabo! de ver3
C&ega de ma! &!mor, Alata#an, claro !e !eremos fa#er contato com voc3
9ran!ilo, tran!ilo &ein gente... 8 falo! !m Alata#an relaxado.
9ran!iloJ @sso at sem graa de to tran!ilo 8 foi a resposta empolgada do
Cartola
:, basto! adicionar a aplicao ao pro2eto, adicionar o "iddle8are e criar
o te"plate. % isso3
0 a s ir at o 'd"in e criar !antas p"ginas !iser, !sando ;9*+ e
n!nca se es!ecendo de !e a 7$+ da <latpage e"pre inicia e ter"ina co" a
barra , N -. 8 completo! Nena.
Agora tem !ma coisa es!isita nesse se! blog, cara. Doc deixo! !m rodap
escrito S4or favor, no faa contato...S no assim !e se fa#. 4or!e voc no
cria !ma p%gina de ContatoJ
Alata#an ol&o! para ele como se fosse !m da!eles ndios pelados da baa de
I!anabara vendo navios port!g!eses pela primeira ve#.
:3 : isso, vamos fa#er !ma p"gina de contato, ento3
4ois bem, ento isso pessoal3
KHH
Captulo [E: Per"itindo contato do outro lado do
:ni$ero
%&&&eeeg&t3 4##t3 %%&&&"ptt3 9#ing3 4###iiitt3
4am8pararampam. 4am3 4am
+" estava Alata#an em s!a nave, !ns 6HH Lm acima
do c&o, 2" !ase no limite da atmosfera, tentando
reg!lar o canal para fa#er contato com se! planeta.
A sistema de com!nicao de s!a nave !tili#a
dobradura de n$el 6 no espao, com envergad!ra de
BE\ a YE\ e isso pode ser seriamente afetado !ando &" !ma tempestade de
asteroides nas redonde#as. No fa# m!ito tempo !e 'atara descobri! o r%dio
como !ma simples sol!o para com!nica(es a grandes distFncias, e foi tambm
nesta poca !e eles so!beram da existncia do 4laneta 9erra e de nossa @nternet.
Nessa &ora fico! ainda mais evidente !e Alata#an no podia viver isolado em
se! espao, precio ter u" "eio para receber contato de o!tras pessoas, no
i"porta Huo ditante ela ete(a".
0nto, na!ele dia eles criaram:
:"a p%gina para Contato
A p"gina de Contato pode variar de !m site para o!tro, mas no tem erro: no
mnimo ela precisa ter !em est" fa#endo contato e !al a s!a mensagem. 0ssas
informa(es so transformadas em !m texto e enviadas por e8mail do servidor para
a s!a caixa de mensagens, sem precisar expTr se! e8mail para estran&os.
Ali"s, esse era o medo !e Alata#an tin&a !ando escreve! s!a nada amig"vel
frase S4or favor no faa contato. Abrigado pela ateno.S. 0le no !eria expTr se!
e8mail para !al!er !m.
Antes de mais nada, lembre8se de exec!tar se! pro2eto, clicando d!as ve#es
sobre o ar!ivo Sexec!tar.batS da pasta do pro2eto.
Agora, na pasta StemplatesS do pro2eto, abra o ar!ivo Srodape.&tmlS e o
KHK
modifi!e, para ficar assim:
<di6 $)ass!GrodapeG=
<a href!G
7A (r) 6iews.$ontato A9
G=
'ara fazer $ontato $omigo- $)i8(e a8(i.
</a=
</di6=
%alve o ar!ivo. <ec&e o ar!ivo. Agora vamos ao navegador para ver como fica
a p"gina principal do site:
http://)o$a)host:?333/
De2a:

4!xa vida, mas !e taman&o de erro esteJ *as a parte mais importante dessa
mensagem de erro isto:
NoNe6erseMat$h: Ne6erse for "me(_b)og.6iews.$ontato" with
arg(ments "*+" and keyword arg(ments "79" not fo(nd.
Rastante evidente, certoJ No existe !ma 7$+ para a vieM locali#ada em
V>me!Pblog.vieMs.contato>, isso !e ele est" di#endo.
KHO
Damos criar essa 7$+ ento: abra o ar!ivo S!rls.pBS da pasta do pro2eto para
edio e insira esta lin&a ao final da c&amada patterns,-:
*r"4$ontato/5"- "6iews.$ontato"+-
%alve o ar!ivo. <ec&e o ar!ivo. 1e volta ao navegador, pressione <6 e ol&a o
res!ltado:
Rom, contin!amos com !ma mensagem de erro, mas agora ela m!do!, ve2a:
Uiew.oesNotE1ist: %o()d not import 6iews. Error was: No mod()e
named 6iews
0m o!tras palavras: no possvel importarV o md!lo vieMs, pois ele no
existe. 4ois ento vamos cri"8lo. Na pasta do pro2eto , me!Pblog -, crie !m novo
ar!ivo c&amadado vieMs.pB e escreva o seg!inte cdigo dentro:
from d0ango.short$(ts import render_to_response
from d0ango.temp)ate import Ne8(est%onte1t
def $ontato*re8(est+:
ret(rn render_to_response*
"$ontato.htm)"-
)o$a)s*+-
$onte1t_instan$e!Ne8(est%onte1t*re8(est+-
KHQ
+
%alve o ar!ivo. <ec&e o ar!ivo.
Doc deve ter estran&ado !e criamos !m novo ar!ivo vieMs.pB na pasta do
pro2eto, ao invs de !sar o ar!ivo vieMs.pB da pasta da aplicao blog. : !e esta
no !ma f!ncionalidade do blog, e sim do site como !m todo. 1evemos lembrar
!e o pro2eto pode ter mais coisas no f!t!ro, alm do se! blog. 4ortanto, !m
ar!ivo vieMs.pB na pasta do pro2eto para f!n(es !e so especficas do pro2eto
fa# bastante sentido.
*as ento, de volta ao navegador, pressione <6 e ve2a como fico!:

Agora o nosso linL f!nciono!, apesar de ficar !m a#!l perdido no verde. Damos
a2!star o estilo de nossa p"gina para mel&orar isso.
Na pasta do pro2eto, v" = pasta SmediaS, abra o ar!ivo SlaBo!t.cssS para edio
e acrescente esse trec&o de cdigo ao final do ar!ivo:
.rodape 7
border: 2p1 so)id b)a$kI
ba$kgro(nd,$o)or: whiteI
$o)or: grayI
margin,top: 23p1I
padding: 23p1I
KH5
9
%alve o ar!ivo. <ec&e o ar!ivo. Dolte ao navegador, pressione <6 e ve2a como
fico!:
Agora sim3 0 agora, ao clicar sobre o linL !e criamos, ve2a o !e acontece:
KH6
Rom, nada mais claro: a template Scontato.&tmlS no existe.
Agora, v" = pasta StemplatesS do pro2eto e crie !m novo ar!ivo: Scontato.&tmlS,
com o seg!inte cdigo dentro:
7A e1tends Gbase.htm)G A9
7A b)o$k tit()o A9%ontato , 77 b)o$k.s(per 997A endb)o$k A9
7A b)o$k h2 A9%ontato7A endb)o$k A9
7A b)o$k $onte(do A9
7A if mostrar A9<hR=77 mostrar 99</hR=7A endif A9
Informe se(s dados abai1o:
<form method!GpostG=
<tab)e=
77 form 99
<tr=
<th=VnbspI</th=
<td=<inp(t type!Gs(bmitG 6a)(e!GEn6iar $ontatoG/=</td=
</tr=
</tab)e=
</form=
7A endb)o$k $onte(do A9
%alve o ar!ivo. <ec&e o ar!ivo.
7fa3 Rastante coisa, no verdadeJ A !e fi#emos a foi declarar, alm dos
blocLs &abit!ais, !m form!l"rio para o envio da mensagem de contato. 1e volta ao
navegador, ve2a como fico! a p"gina de contato:
KH?
*as como noto!, s &" o boto S0nviar contatoS. 1e volta ao cdigo, ve2a !e
escrevemos !ma vari"vel WW form XX. : esta vari"vel !e vai tra#er a m"gica para
dentro do template. 0 como ela no foi declarada na nossa vieM, bastante nat!ral
!e a!i no aparea nada alm do !e vemos.
Trabal3ando co" o for"ul%rio dinS"ico do D(ango
Agora, abra o ar!ivo SvieMs.pBS da pasta do pro2eto novamente, e locali#e a
seg!inte lin&a:
def $ontato*re8(est+:
Abaixo dela, acrescente a seg!inte:
form ! /orm%ontato*+
*as isso no basta, afinal, !em o <ormContato aliJ 0nto agora, locali#e esta
lin&a:
from d0ango.temp)ate import Ne8(est%onte1t
0 acrescente este trec&o de cdigo:
from d0ango import forms
$)ass /orm%ontato*forms./orm+:
nome ! forms.%har/ie)d*ma1_)ength!B3+
KHC
emai) ! forms.Emai)/ie)d*re8(ired!/a)se+
mensagem ! forms./ie)d*widget!forms.Te1tarea+
Agora o ar!ivo fico! assim:
from d0ango.short$(ts import render_to_response
from d0ango.temp)ate import Ne8(est%onte1t
from d0ango import forms
$)ass /orm%ontato*forms./orm+:
nome ! forms.%har/ie)d*ma1_)ength!B3+
emai) ! forms.Emai)/ie)d*re8(ired!/a)se+
mensagem ! forms./ie)d*widget!forms.Te1tarea+
def $ontato*re8(est+:
form ! /orm%ontato*+
ret(rn render_to_response*
"$ontato.htm)"-
)o$a)s*+-
$onte1t_instan$e!Ne8(est%onte1t*re8(est+-
+
A !e fi#emos foi criar !m form!l"rio. 0ste form!l"rio tem trs campos: nome,
email e mensagem. A campo SnomeS do tipo para receber caracteres, n!ma
larg!ra m"xima de 6H caracteres. A campo SemailS do tipo para receber e8mail,
mas no re!erido. 4or fim, o campo SmensagemS de !m tipo livre, !e ser"
exibido como !m 9extarea, o! se2a, !ma caixa de texto maior !e a &abit!al, !e
aceita m!itas lin&as livremente.
%alve o ar!ivo. Dolte ao navegador e pressione <6 para at!ali#ar a p"gina de
contato. De2a como fico!:
KHE
De2a o !anto esse rec!rso de form!l"rios dinFmicos do 12ango fant"stico3
9emos o nosso form!l"rio sendo exibido em !m piscar de ol&os3 *as isso no
basta, pois ele ainda no est" f!ncionando de fato.
4ois ento voltemos ao ar!ivo SvieMs.pBS para locali#ar a seg!inte lin&a:
form ! /orm%ontato*+
%!bstit!a essa lin&a pelo seg!inte trec&o de cdigo:
if re8(est.method !! "'O&T":
form ! /orm%ontato*re8(est.'O&T+
if form.is_6a)id*+:
form.en6iar*+
mostrar ! "%ontato en6iadoW"
e)se:
form ! /orm%ontato*+
0sse nosso cdigo fa# o seg!inte:
%e o mtodo dessa re!est do tipo 4A%9, entende8se !e o !s!"rio clico!
sobre o boto S0nviar contatoS. @sso fa# sentido por!e o carregamento padro de
p"ginas !tili#a o mtodo do tipo I09. A! se2a, somente !ando o !s!"rio clica
no boto, e desde !e a tag YformZ do template poss!i !m arg!mento
KHG
met&od[SpostS, essa lin&a ser" v"lida\
Neste caso, a vari"vel SformS recebe a instFncia do form!l"rio
S<ormContatoS, contendo os valores enviados no re!est.4A%9. 0sses valores
so a!eles !e o !s!"rio informo! no form!l"rio.
<eito isso, o form!l"rio passa por !ma validao , form.isPvalid,- -. :
nesse momento !e ele verifica se os campos re!eridos foram todos
preenc&idos, e se todos os campos foram preenc&idos corretamente de acordo
com se!s tipos ,por exemplo: !m endereo de e8mail no pode ter !m formato
diferente do &abit!al !e con&ecemos-\
%e a validao seg!ir com s!cesso, c&amado o mtodo form.enviar,-, !e
enviar" a mensagem\
4or fim, mostrada !ma mensagem !e avisa ao !s!"rio !e a mensagem
foi enviada com s!cesso.
No caso de !al!er coisa dessas acima no sair da forma esperada, as devidas
mensagens de erro o! validao sero exibidas.
%alve o ar!ivo. Dolte ao navegador. 0 faa o seg!inte:
4reenc&a apenas o campo S08mailS, com !m e8mail inv"lido
Cli!e sobre o boto S0nviar contatoS sem preenc&er os demais campos.
De2a como fico!:
KKH
Doc pode notar !e os campos re!eridos foram exigidos, e o formato do
campo de 08mail no foi aceito.
A esttica fica por conta do se! C%%.
Agora preenc&a todos os campos corretamente:
Nome: *ame
08mail: mamae.do.alata#an]Latara.gov
*ensagem: Al" fil&in&o, so! e! !sando o e8mail do trabal&o indevidamente
0 cli!e sobre S0nviar contatoS. De2a o !e acontece:
4!xa, mas o !e isso agoraJ
Anime8se3 @sso !m bom sinal, pois significa !e c&egamos ao ponto no cdigo
onde t!do foi validado e o mtodo form.enviar,- no foi encontrado.
#n$iando o eP"ail do contato
1e volta ao ar!ivo SvieMs.pBS, locali#e a seg!inte lin&a:
mensagem ! forms./ie)d*widget!forms.Te1tarea+
Agora acrescente abaixo dela:
def en6iar*se)f+:
tit()o ! "Mensagem en6iada pe)o site"
destino ! "a)atazanXgmai).$om"
KKK
te1to ! GGG
Nome: A*nome+s
E,mai): A*emai)+s
Mensagem:
A*mensagem+s
GGG A se)f.$)eaned_data
send_mai)*
s(b0e$t!tit()o-
message!te1to-
from_emai)!destino-
re$ipient_)ist!YdestinoZ-
+
Agora s!bstit!a o trec&o >alata#an]gmail.com> pelo se! e8mail.
*as afinal, o !e esse mtodo gigantesco fa#J
0le define !m tt!lo para o e8mail, !e ser" enviado para voc\
0le define !e o destino desse e8mail ser" o se! e8mail\
0le define o texto desse e8mail com as informa(es preenc&idas pelo !s!"rio,
!sando a sintaxe de formatao de strings do 4Bt&on\
0 por fim, ele envia !m e8mail , f!no sendPmail,- - com esses dados.
No 4Bt&on, para informar !ma string com mais de !ma lin&a, voc pode !sar
trs aspas d!plas o! simples, como por exemplo SSSesta a!iSSS.
*as o mtodo sendPmail no foi devidamente importado. 4ortanto, v" ao incio
do ar!ivo e acrescente a seg!inte lin&a:
from d0ango.$ore.mai) import send_mai)
Agora, o ar!ivo SvieMs.pBS completo fico! assim:
from d0ango.short$(ts import render_to_response
from d0ango.temp)ate import Ne8(est%onte1t
from d0ango import forms
from d0ango.$ore.mai) import send_mai)
$)ass /orm%ontato*forms./orm+:
nome ! forms.%har/ie)d*ma1_)ength!B3+
KKO
emai) ! forms.Emai)/ie)d*re8(ired!/a)se+
mensagem ! forms./ie)d*widget!forms.Te1tarea+
def en6iar*se)f+:
tit()o ! "Mensagem en6iada pe)o site"
destino ! "a)atazanXgmai).$om"
te1to ! GGG
Nome: A*nome+s
E,mai): A*emai)+s
Mensagem:
A*mensagem+s
GGG A se)f.$)eaned_data
send_mai)*
s(b0e$t!tit()o-
message!te1to-
from_emai)!destino-
re$ipient_)ist!YdestinoZ-
+
def $ontato*re8(est+:
if re8(est.method !! "'O&T":
form ! /orm%ontato*re8(est.'O&T+
if form.is_6a)id*+:
form.en6iar*+
mostrar ! "%ontato en6iadoW"
form ! /orm%ontato*+
e)se:
form ! /orm%ontato*+
ret(rn render_to_response*
"$ontato.htm)"-
)o$a)s*+-
KKQ
$onte1t_instan$e!Ne8(est%onte1t*re8(est+-
+
%alve o ar!ivo. <ec&e o ar!ivo. Dolte ao navegador e pressione <6. 0le vai
fa#er !ma perg!nta sobre processar dados, devido ao mtodo dessa re!isio ter
sido do tipo 4A%9. Confirme a perg!nta e ve2a o res!ltado:

Rom, avanamos, mas o !e essa mensagem !er di#erJ
*233[2- "%onne$tion ref(sed"+
@sso acontece por !e preciso config!rar se! pro2eto com as informa(es de
!al servidor %*94 ele deve !sar para enviar esta mensagem de e8mail.
Configura)e de en$io de eP"ail
4ara isso, abra o ar!ivo Ssettings.pBS da pasta do pro2eto para edio, v" ao
final do ar!ivo e acrescente o seg!inte trec&o de cdigo dentro:
EM#IL_QO&T ! "se( endereMo de &MT'"
EM#IL_QO&T_>&EN ! "se( endereMo de e,mai)"
EM#IL_QO&T_'#&&OON. ! "s(a senha"
EM#IL_&>FPE%T_'NE/IT ! "YF)og do #)atazanZ"
%e caso se! servidor de e8mail !tili#ar conexo seg!ra, acrescente esta lin&a:
KK5
EM#IL_'ONT ! B?C
%e caso se! servidor de e8mail !tili#ar conexo do tipo 9+%, acrescente esta
lin&a tambm:
EM#IL_>&E_TL& ! Tr(e
Agora voltando ao navegador e pressionando <6, ve2a o !e acontece:

4ronto3 *ais !ma p"gina virada em nossa camin&ada3
4artindo para o!tra forma de receber contato...
Caramba3 .!ando e! vi o form!l"rio com os campos na p"gina depois de
escrever menos de KH lin&as de cdigo, fi!ei espantado3
%im, e ve2a, o !e voc fe#, n!m res!mo r"pido foi isso:
1eclaro! !m linL para a p"gina de contato !sando a template tag W^ !rl
^X\
Crio! !ma vieM para a p"gina de contato\
Crio! !m novo template para a vieM de contato. Nele foi criado !m
YformZ\
1eclaro! !ma classe de <orm e se!s campos\
1efini! na vieM !ma condio !e verifica se o !s!"rio clico! sobre o
boto de enviar para efet!ar o envio do e8mail\
KK6
1eclaro! !m mtodo SenviarS, !e d" a ao !e !eremos ao form\
0sse mtodo formata o texto da mensagem e envia o e8mail, !sando !ma
f!no do 12ango para isso\
0 config!ro! as settings para envio de e8mails.
Ao todo foram E passos para c!mprir a nossa misso de &o2e3 0 de !ebra
ainda fe# !m a2!ste no vis!al no rodap.
Alata#an estava em xtase, se! corao da frente clareava o peito, e isso tin&a a
ver com s!a alegria em c&egar at a!i no est!do do 12ango.
Rom, 2" !e aprendemos tanto assim &o2e, aman& vamos criar rec!rsos para
se!s !s!"rios enviarem Coment"rios em se! blog. Cada artigo vai ter s!a prpria
lista de coment"rios3
%&oM de bola3
KK?
Captulo 11: Deixando os comentrios flurem
Alatazan estava bebendo um copo d'gua no intervalo da aula, quando uma
garota chegou at ele. Ela segurava um copo com refrigerante e comia um pastel.
Oi, desculpe, mas seu brao est suo aqui oh.
Alatazan deu uma olhada em seu cotovelo, mas a !nica coisa que havia ali eram
as listras habituais dos "atarenses. #m pouco constrangido e sem saber como
e$plicar % moa, ele gagueou, antes que outra garota, que parecia ser amiga dela,
se apro$imou rindo.
&'o acredito... n'o sua tonta, mancha, de nascena, voc( est fazendo o
menino ficar com vergonha aqui... presta aten'o)
E riu um pouco mais...
Alatazan deu uma risadinha meio de meia boca e deu um eito de sair dali... n'o
queria entrar naquele *debate*.
+epois de pensar um pouco, ele percebeu que isso tinha seu lado bom. &o final
das contas, essa liberdade de e$press'o acaba sendo positiva e bem,vinda.
Habilitando comentrios no blog
-s vezes voc( quer que as pessoas tenham um espao para emitir suas opinies
sobre aquilo que escreve em seu blog. .uitas pessoas gostam disso. E o +ango
oferece esse recurso de maneira muito acess/vel.
A coisa se resume a habilitar a aplica'o contrib de comentrios, adicionar uma
#01 e depois austar alguns templates. 2amos l3
Antes de mais nada, e$ecute seu proeto clicando duas vezes sobre o arquivo
"executar.bat" da pasta do proeto.
&a pasta do proeto, abra o arquivo "settings.py" para edi'o e localize a
setting I!"#$$%D&#''!. Adicione a ela a seguinte linha4
'django.contrib.comments',
556
Ou sea, o trecho de c7digo da setting I!"#$$%D&#''! fica assim4
INSTALLED_APPS = (
'django.contrib.aut',
'django.contrib.contentt!"es',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.admin',
'django.contrib.s!ndication',
'django.contrib.#$at"ages',
'django.contrib.comments',
'b$og',
%
8emos agora uma nova aplica'o no proeto4 comments.
9alve o arquivo. :eche o arquivo.
Agora atualize o banco de dados, clicando duas vezes sobre o arquivo
"gerar&banco&de&dados.bat" da pasta do proeto.
#ma anela do .9,+O9 ser e$ibida mostrando o seguinte resultado4
Ao carregar o navegador na #01 do #dmin4
tt"&''$oca$ost&()))'admin'
2oc( pode ver que h ali uma nova aplica'o chamada "Comments"4
55;

+evido a uma srie de austes que ela sofreu para a (ers)o 1.*, poss/vel que
em sua vers'o ela ainda n'o estea traduzida por completo para portugu(s
brasileiro.
.ais % frente, voc( vai utilizar essa se'o do #dmin para administrar os
comentrios recebidos, pois tem hora que a paci(ncia n'o suficiente para lidar
com algumas liberdades de certos indiv/duos.
<ois agora vamos ao segundo passo4 adicionar uma +,$ para a aplica'o
"comments".
&a pasta do proeto, abra o arquivo "urls.py" para edi'o e adicione a seguinte
#01 ao final da fun'o patterns-.4
(r'*comments'', inc$ude('django.contrib.comments.ur$s'%%,
A fun'o include-. inclui as #01s de outro arquivo na #01 em quest'o. &este
caso, as #01s do m7dulo /d0ango.contrib.comments.urls/ s'o inclu/das na #01
/1comments2/. &a prtica, se no m7dulo /d0ango.contrib.comments.urls/ houver
uma #01 /1post23/, o +ango unta uma coisa % outra e entende que possui uma
#01 /1comments2post23/ apontando para tal. =sso feito para todas as #01s
encontradas no m7dulo inclu/do >/d0ango.contrib.comments.urls/?.
@ uma solu'o prtica para dividir as #01s quando o arquivo se torna muito
e$tenso, e tambm muito prtico quando voc( quer separar as coisas para que
suas aplicaAes se tornem mais fle$/veis.
Agora, o arquivo "urls.py" ficou assim4
#rom django.con#.ur$s.de#au$ts im"ort +
55B
#rom django.con# im"ort settings
, -ncomment te ne.t t/o $ines to enab$e te admin&
#rom django.contrib im"ort admin
admin.autodisco0er(%
#rom b$og.mode$s im"ort Artigo
#rom b$og.#eeds im"ort -$timosArtigos
ur$"atterns = "atterns('',
(r'*1', 'django.0ie/s.generic.date_based.arci0e_inde.',
2'3uer!set'& Artigo.objects.a$$(%,
'date_#ie$d'& '"ub$icacao'4%,
(r'*admin'(.+%', admin.site.root%,
(r'*rss'(5P6ur$7.+%'1', 8
'django.contrib.s!ndication.0ie/s.#eed',
2'#eed_dict'& 2'u$timos'& -$timosArtigos44%,
(r'*artigo'(5P6artigo_id78d9%'1', 'b$og.0ie/s.artigo'%,
(r'*media'(.+%1', 'django.0ie/s.static.ser0e',
2'document_root'& settings.:EDIA_;<<T4%,
(r'*contato'1', '0ie/s.contato'%,
(r'*comments'', inc$ude('django.contrib.comments.ur$s'%%,
%
9alve o arquivo. :eche o arquivo.
"rabal4ando as template tags no template do artigo
Agora, na pasta do proeto, abra a pasta "blog2templates2blog". +entro dela,
abra o arquivo "artigo.4tml" para edi'o e localize a seguinte linha4
2= e.tends >base.tm$> =4
Acrescente abai$o dela a seguinte linha4
2= $oad comments =4
=sso vai carregar as template tags da aplica'o comments. Agora localize esta
outra linha4
22 artigo.conteudo 44
5CD
Acrescente esse trecho de c7digo abai$o dela4
6di0 c$ass=>comentarios>7
6?7En0ie um comentario6'?7
2= render_comment_#orm #or artigo =4
6'di07
9alve o arquivo. Agora v ao navegador e localize a #01 do artigo4
tt"&''$oca$ost&()))'artigo'@'
E vea o resultado4

Opa, a/ est um formulrio de contato completo) .as o que n7s fizemos ali3 A
template tag 56 render&comment&form for artigo 67 gera um formulrio
dinEmico de comentrios para o obeto "artigo". 1embra,se do 8orm que
trabalhamos no !ltimo cap/tulo3
.as ele ficou meio deformando, n'o3 #m pouco de C!! vai fazer bem pra esse
laFout. +a pasta do proeto, entre em "media", abra o arquivo "layout.css" para
edi'o e acrescente o seguinte trecho de c7digo ao final do arquivo4
#orm $abe$ 2
dis"$a!& b$ocAB
4
5C5
te.tarea 2
eigt& @))".B
4
9alve o arquivo. :eche o arquivo. 2olte ao navegador, atualize e vea como
ficou4

Agora vamos preencher o formulrio de comentrio para ver o que acontece3
<reencha assim4
&ome4 9arota da %scola
E,mail4 garota:escola.com
#014 4ttp:22escola.com2garota2
Gomentrio4 'arab;ns pelo blog<
Agora clique no bot'o "'ost" e vea o resultado4

5CC
Hacana) Ent'o o envio do comentrio funcionou) &'o se preocupe, vamos
mudar o visual dessa pgina a/ ,. Agora volte % pgina anterior no navegador >
#$"=%s>uerda ?.
2amos agora e$ibir os comentrios do artigo3
2olte ao template "artigo.4tml" que estvamos editando e localize a seguinte
linha4
6di0 c$ass=>comentarios>7
Acrescente abai$o da linha o trecho de c7digo abai$o4
6?7Comentarios6'?7
2= get_comment_$ist #or artigo as comentarios =4
2= #or comentario in comentarios =4
6di0 c$ass=>comentario>7
Nome& 22 comentario.name 446br'7
2= i# comentario.ur$ =4-;L& 22 comentario.ur$ 44
2= endi# =46br'7
22 comentario.commentD$inebreaAs 44
6r'7
6'di07
2= end#or =4
9alve o arquivo. 2olte ao navegador, atualize a pgina do artigo e vea como
ficou4
5CI

J melhorou, n'o 3 <ois olha o que fizemos4 n7s declaramos a template tag 56
get&comment&list for artigo as comentarios 67 que obtm todos os comentrios
que e$istem para o obeto "artigo" e os coloca na varivel "comentarios".
+epois, com a varivel em m'os, n7s fazemos um lao nela, usando a template
tag 56 for comentario in comentarios 67, ou sea, todo o trecho de c7digo que
est entre as template tags 56 for 67 e 56 endfor 67 ser repetido a cada
comentrio. 9e houverem K comentrios na lista, ent'o ser repetido K vezes, uma
para cada comentrio, que representado pela varivel "comentario".
<or fim, a template tag 56 if comentario.url 67 sigfinica que o trecho de
c7digo que est entre ela e a template tag 56 endif 67 s7 deve ser mostrado se o
comentrio possuir o campo "url" preenchido.
Agora, o template "artigo.4tml" completo est assim4
2= e.tends >base.tm$> =4
2= $oad comments =4
2= b$ocA titu$o =422 artigo.titu$o 44 E
22 b$ocA.su"er 442= endb$ocA =4
2= b$ocA @ =422 artigo.titu$o 442= endb$ocA =4
5CL
2= b$ocA conteudo =4
22 artigo.conteudo 44
6di0 c$ass=>comentarios>7
6?7Comentarios6'?7
2= get_comment_$ist #or artigo as comentarios =4
2= #or comentario in comentarios =4
6di0 c$ass=>comentario>7
Nome& 22 comentario.name 446br'7
2= i# comentario.ur$ =4-;L& 22 comentario.ur$ 44
2= endi# =46br'7
22 comentario.commentD$inebreaAs 44
6r'7
6'di07
2= end#or =4
6?7En0ie um comentario6'?7
2= render_comment_#orm #or artigo =4
6'di07
2= endb$ocA =4
Agora observe que no formulrio do template, e$iste tambm um bot'o
"'re(ie?". Ele faz o seguinte4 ao invs de enviar o comentrio, ele apenas e$ibe o
resultado para que o usurio vea como vai ficar antes de enviar. =sso !til para que
ele tenha uma segunda chance de austar algo no te$to.
.as chega de e$plicaAes)
A fun'o de pr,visualiza'o do comentrio
Escreva um novo comentrio, clique sobre o bot'o "'re(ie?" e vea o que
acontece4
5CK

<rimeiro, observe a cai$a destacada. Ali ser e$ibida a pr;@(isualiAaB)o do
comentrio, antes de confirmar o seu envio. Esta op'o n'o obrigat7ria, voc(
pode escolher entre trabalhar com pr,visualiza'o ou n'o, e vamos ver como fazer
isso em breve.
.as o que precisamos fazer agora dar um eito no visual dessa pgina. Ela n'o
est nada boa.
&a pasta "templates" da pasta do proeto, crie uma nova pasta "comments".
+entro da nova pasta crie um arquivo chamado "base.4tml" e escreva dentro o
seguinte c7digo4
2= e.tends >base.tm$> =4
2= b$ocA titu$o =4
2= b$ocA tit$e =42= endb$ocA =4
2= endb$ocA =4
2= b$ocA conteudo =4
2= b$ocA content =42= endb$ocA =4
2= endb$ocA =4
9alve o arquivo.
5CM
.as que confus'o com tantos blocks) Hom, o que o c7digo acima est fazendo
levar todos os templates da contrib "comments" para estenderem o template do
seu blog, ou sea, eles ser'o encai$ados no seu visual.
2olte ao navegador, pressione 8C , ser feita uma pergunta sobre os dados
enviados, apenas confirme , e vea como ficou4
J melhorou, n3 Agora, clique no bot'o "'ost" para publicar esse comentrio.
2ea4
5C6
2ea que nesta pgina a mudana no template tambm surtiu efeito. .as
precisamos austar algo aqui. Ao menos um linD para a pgina principal
necessria, certo3 &'o podemos dei$ar uma pgina sem meios para dar
continuidade.
Depois de en(iado o comentrio...
<ois ent'o v % pasta do proeto, e abra a pasta "templates2comments". +entro
dela, crie o arquivo "posted.4tml" com o seguinte c7digo dentro4
2= e.tends >base.tm$> =4
2= b$ocA titu$o =4ComentFrio en0iadoG E
22 b$ocA.su"er 442= endb$ocA =4
2= b$ocA conteudo =4
6"7
<brigado "or en0iar seu comentFrio, $ogo 0ou dar uma o$adaG
6'"7
6"76a re#=>'>7Agora c$i3ue a3ui "ara 0o$tar "ara o b$ogG6'a76'"7
2= endb$ocA =4
9alve o arquivo. :eche o arquivo. 2olte ao navegador, atualize e vea como
ficou4
5C;

Agora, s7 lanar vrios artigos e comentrios para ver como a coisa funciona
bem)
# camin4o de colocar o site no ar...
Alatazan foi enftico, ao final4
Hom, vamos ver o que eu fiz hoe4
=nstalei a aplica'o /d0ango.contrib.comments/N
9erei o banco de dadosN
Adicionei a #01 que inclui todas as #01s da aplica'o /comments/N
&os templates que usam template tags de comentrios, tive que carreg,las
com 56 load comments 67N
#sei as template tags 56 render&comment&form 67 e 56
get&comment&list 67, para gerar um formulrio e obter os comentrios de
um artigo, respectivamenteN
E defini um template "base.4tml" para austar as pginas de comentrios
ao layout do siteN
E$atamente) E voc( ainda fez um auste no G99 para dar uma quebra de
linha nas tags OlabelP. , Gartola completou.
Joia) Agora posso colocar esse blog no ar)
.esmo3 2oc( acha que est bom pra fazer o deploy3 , &ena perguntou, ela
tambm est ansiosa para ver o blog de Alatazan estrear no servidor.
Hom, na verdade ainda quero melhorar o visual do site, mas...
J sei, amanh' vamos tirar o dia pra ver H"E$ e C!! o suficiente para
transformar seu blog com um bom layout)
Ent'o combinado.
&o pr7$imo cap/tulo, vamos trabalhar novamente no laFout do site, mas agora
com um foco mais profissional4 vamos dar um visual t/pico de um blog bem
elaborado ao site do Alatazan, afinal, com tanto estudo, ele merece algo bem
apresentvel e o principal4 no ar.
5CB
Captulo 1F: +m pouco de H"E$ e C!! sG faA bem
Alatazan aceitou o convite de &ena para assistir % estreia de sua irm' mais nova
em um desfile de moda. Estava um pouco frio, mas ainda era cedo, chegaram ao
ginsio cerca de uma hora e meia antes da abertura, pois foi &ena que dirigiu para
levar a irm'.
Gomo estavam por ali, entraram no vestirio com a menina, e acabaram vendo
como a coisa acontece nos bastidores.
@ engraado como essas coisas parecem uma completa baguna para quem n'o
do ramo. <anos, fitas, fai$as, coisas coloridas, arames e toda sorte de agulhas e
linhas eram s7 uma fra'o da variedade de coisas ali, e no comeo as modelos se
pareciam mais com atrizes de picadeiro.
O cheiro de cola imperava no ar, e havia tambm um calorzinho com cheiro de
ferro de passar ligado, do lado direito, pr7$imo % cortina.
*&eninha*, como Alatazan chama carinhosamente a irm' de &ena, seria uma
das !ltimas a participar e eles ficaram l dentro o suficiente para ver as primeiras
sa/rem do vestirio e caminharem para a passarela.
O interessante que depois de toda a arruma'o, em quest'o de segundos a
coisa parece sair de uma situa'o incompreens/vel para uma apresenta'o louvvel.
A moa que antes parecia um papagaio depenado, estava agora refinada,
delicada, cheia de glamour.
Ahh, ia esquecendo... foi nesse dia que &ena e Alatazan estudaram QR8.1 e
G99 e o resultado foi muito interessante, acompanhe...
"empo para o -H.H"E$ e o C!!
&o cap/tulo 6, trabalhamos com templates, e tivemos um contato pr7$imo com
o R8.1.
&o cap/tulo ;, trabalhamos com arquivos estticos, e l usamos um pouco de
G99.
.as agora, o que vamos tratar n'o o conhecimento do sistema de templates, e
5ID
muito menos a disposi'o de arquivos estticos. Estamos falando de apresenta'o
visual, a roupagem esttica que o site precisa receber antes de ser apresentado ao
usurio.
&'o a nossa inten'o fazer desse um trabalho visual para ganhar algum
pr(mio, e sim, conhecer um pouco do assunto.
Antes de mais nada, e$ecute seu proeto, clicando duas vezes no arquivo
"executar.bat" da pasta do proeto.
<ois bem, vamos comear pelo template mais bsico de nosso site. Aquele que
todos e$tendem4 o "base.4tml", da pasta "templates" do proeto. Abra esse
arquivo para edi'o e o modifique para ficar assim4
6GD<CTHPE tm$ P-ILIC >E''J?C''DTD KLT:L @.) Transitiona$''EN>
>tt"&''///./?.org'T;'.tm$@'DTD'.tm$@Etransitiona$.dtd>7
6tm$ .m$ns= >tt"&''///./?.org'@MMM'.tm$>
.m$&$ang=>"tEbr>
$ang=>"tEbr>
7
6ead7
6tit$e72= b$ocA titu$o =4I$og do A$ataNan2= endb$ocA =46'tit$e7
2= b$ocA meta =4
6meta tt"Ee3ui0=>ContentEt!"e>
content=>te.t'tm$B
carset=ut#E(> '7
6meta tt"Ee3ui0=>ContentELanguage> content=>"tEbr> '7
6meta name=>Ae!/ords>
content=>P!ton, Django, A$ataNan, Oatara, b$og> '7
6meta name=>descri"tion> content=>Este P o b$og do A$ataNan, um
Aatarense a"rendendo Django.> '7
2= endb$ocA meta =4
2= b$ocA #eeds =4
6$inA re$=>a$ternate>
t!"e=>a""$ication'rss9.m$>
tit$e=>-$timos artigos do A$ataNan>
re#=>'rss'u$timos'> '7
5I5
2= endb$ocA #eeds =4
2= b$ocA st!$e =4
6$inA re$=>st!$eseet>
t!"e=>te.t'css>
re#=>22 :EDIA_-;L 44$a!out.css>'7
2= endb$ocA st!$e =4
2= b$ocA scri"ts =4
2= endb$ocA scri"ts =4
6'ead7
6bod!7
6di0 id=>tudo>7
6di0 id=>to"o>7
2= b$ocA to"o =4
6di0 id=>#oto>7Qnbs"B6'di07
I$og do A$ataNan
2= endb$ocA to"o =4
6'di07
6di0 id=>menu>7
2= b$ocA menu =4
2= s"ace$ess =4
6u$7
6$i76a re#=>'>7Pagina inicia$6'a76'$i7
6$i76a re#=>'sobreEmim'>7Sobre mim6'a76'$i7
6$i76a re#=>2= ur$ 0ie/s.contato =4>7Contato6'a76'$i7
6'u$7
2= ends"ace$ess =4
2= endb$ocA menu =4
6'di07
6@72= b$ocA @ =42= endb$ocA =46'@7
5IC
6di0 c$ass=>cor"o>7
2= b$ocA conteudo =42= endb$ocA =4
6'di07
2= inc$ude >roda"e.tm$> =4
6'di07
6'bod!7
6'tm$7
9alve o arquivo. Assegure,se de que est salvando o arquivo no padr'o +"8@I.
.as quanta coisa hein3
Gomo pode notar, modificamos o template em grande parte, portanto, vamos
falar das mudanas por partes.
H"E$ ou HH"E$J
A principal mudana estrutural que fizemos ali foi que sa/mos do H"E$ para
o HH"E$. =sso aconteceu por causa dessas cinco linhas4
6GD<CTHPE tm$ P-ILIC >E''J?C''DTD KLT:L @.) Transitiona$''EN>
>tt"&''///./?.org'T;'.tm$@'DTD'.tm$@Etransitiona$.dtd>7
6tm$ .m$ns=>tt"&''///./?.org'@MMM'.tm$>
.m$&$ang=>"tEbr>
$ang=>"tEbr>7
O QR8.1 uma e(oluB)o do R8.1, que obedece a regras melhor definidas.
=sso a torna potencialmente mais rpida e melhor compreendida por navegadores e
mecanismos de busca.
As principais novidades que o QR8.1 oferece s'o4
A pgina deve iniciar com uma declara'o de DKC"L'%N
A tag M4tmlN deve possuir um namespace e defini'o de idiomaN
Ela case sensitive, ou sea, letras mai!sculas e min!sculas s'o consideradas
diferentesN
8odas as tags devem ser declaradas em letras min!sculas >e$.4 MbodyN ao
invs de MOKDLN?N
8odas as tags vazias devem ser fechadas com uma barra ao final >e$.4 Mbr2N
5II
ao invs de MbrN?N
8odas as tags preenchidas devem ser fechadas >e$.4 MoptionNtesteM2optionN
ao invs de MoptionNteste?N
8odos os atributos das tags devem ser abertos e fechados com aspas duplas
>e$.4 Mp alignP"center"N ao invs de Mp alignPcenterN?.
DKC"L'%
O DKC"L'% indica qual o tipo da pgina. Gada tipo implica em um conunto
de regras diferentes que ser'o aplicadas % pgina quando esta for renderizada.
Os tipos e$istentes s'o4
"ransitional , o tipo mais fle$/vel. <ermite tags R8.1 que s'o marcadas
como deprecated >marcadas como descontinuadas? e permite tambm pginas
que n'o usem G99 da maneira devidaN
!trict , o tipo mais r/gido. Aplica todas as regras *ao p da letra*N
8rameset , aplica regras espec/ficas para frames e tambm possui a mesma
fle$ibilidade da "ransitionalN
&amespace e idioma
O padr'o que definimos aponta o XML namespace
*http4SSTTT.TI.orgS5BBBS$html*, que define o documento como compat/vel com o
padr'o de QR8.1 definido pelo UIG em 5BBB. Alm disso, definimos o idioma
como "pt@br"
Oloco "meta"
2oc( viu que definimos um 56 blocD meta 673 <ois bem, ali que vamos
descrever tags R8.1 de meta,definiAes. As que definimos agora s'o4
6meta tt"Ee3ui0=>ContentEt!"e>
content=>te.t'tm$B
carset=ut#E(> '7
Esta acima define o padr'o de caracteres utf@I, ou sea, +nicode, o conunto de
caracteres que suporta os mais importantes alfabetos do mundo.
6meta tt"Ee3ui0=>ContentELanguage> content=>"tEbr> '7
Esta outra acima define o idioma do conte!do como "portuguQs brasileiro".
6meta name=>Ae!/ords>
content=>P!ton, Django, A$ataNan, Oatara, b$og> '7
5IL
Esta outra acima define as palavras,chave para busca. O ideal informar entre C
e 1* pala(ras@c4a(e, pois isso torna sua pgina mais consistente no momento de
ser inde$ada por mecanismos de busca como o Voogle.
&'o invente de colocar ali CD ou ID palavras pensando que isso vai fazer sua
pgina ficar *mais importante*. #ma atitude dessa faz as palavras contidas
perderem seu *valor* no momento da busca, e o tiro sai pela culatra.
6meta name=>descri"tion> content=>Este P o b$og do A$ataNan, um
Aatarense a"rendendo Django.> '7
Esta acima define a descri'o da pgina. Os mecanismos de busca >como o
Voogle? a utilizam para sua descri'o quando sua pgina listada nos resultados de
uma busca.
Olocos "feeds"R "style" e "scripts"
Gada um desses tr(s ser usado para um fim espec/fico4 :eeds, Estilos e
Java9cripts, respectivamente.
Di(ises do layout
di( "tudo"
Gom esta di(, criamos um cont(iner capaz de abranger toda a pgina, assim
podemos delimitar a pgina para ficar mais amigvel a resoluAes de tela menores,
e tambm com uma apar(ncia mais agradvel.
di( "topo"
@ o novo cont(iner para o topo da pgina, onde estar a identifica'o do site,
presente em todas as pginas.
di( "menu"
@ o novo cont(iner para o menu geral do site. dentro dela h uma lista n)o@
numerada > MulN ?, que tem cada um de seus itens > MliN ? como sendo um item do
menu.
di( "corpo"
@ o novo cont(iner para o conte!do da pgina.
Hom, agora que tudo foi esclarecido, v ao navegador no seguinte endereo4
tt"&''$oca$ost&()))'
5IK
E vea como ficou4

Hom, est na cara que n'o mudou muita coisa n3 .as agora vamos % mgica, e
a/ que voc( precisa observar com maior aten'o.
+a forma que estruturamos o H"E$, podemos austar nosso laFout para ficar
assim4

5IM
<ara faz(,lo, v % pasta do proeto e abra a pasta "media". +ali, abra o arquivo
"layout.css" para edi'o.
"rabal4ando no estilo da pgina
2amos adotar uma atitude radical4 limpe o arquivo, delete todo seu conteSdo.
9alve o arquivo, volte ao navegador e vea como ficou4
Gompletamente sem estilo G99, certo3 O", agora acrescente o seguinte trecho
de c7digo ao arquivo de G994
bod! 2
#ontE#ami$!& aria$B
bacAgroundEco$or& ,eeeB
co$or& ,???B
4
@ 2
margin& @)". R)". @)". R)".B
4
R 2
margin& )B
#ontEsiNe& @.RemB
5I6
4
9alve o arquivo, atualize o navegador e vea como ficou4

.udana pequena3 Agora acrescente este trecho de c7digo4
'+ La!out +'
,tudo 2
"osition& abso$uteB
bacAgroundEco$or& /iteB
margin& R)". ) R)". E?M)".B
/idt& ST)".B
$e#t& U)=B
border& @)". so$id ,aaaB
4
9alve o arquivo, atualize o navegador e vea como ficou4
5I;

Agora temos uma cai$a fi$a no centro, certo3 2amos agora acrescentar este
trecho de c7digo4
,to"o 2
#ontEsiNe& ?emB
margin& R)".B
4
,to"o ,#oto 2
#$oat& rigtB
bacAgroundEimage& ur$('media'#oto.j"g%B
bacAgroundEre"eat& noEre"eatB
bacAgroundE"osition& ER)". E?)".B
/idt& UT".B
eigt& UT".B
border& @". so$id ,VSaB
4
9alve o arquivo, atualize o navegador e vea como ficou4
5IB

Agora temos o topo da pgina) Agora acrescente mais este4
.cor"o 2
margin& R)". R)". ) R)".B
4
.roda"e 2
c$ear& botB
o0er#$o/& iddenB
bacAgroundEco$or& ,(MaB
margin& R)".B
#ontEsiNe& ).(emB
co$or& /iteB
"adding& @)".B
te.tEa$ign& centerB
4
.roda"e a 2
co$or& /iteB
4
9alve o arquivo, atualize o navegador e vea como ficou4
5LD

<ronto, nosso conteSdo e rodap; tambm est'o resolvidos) Agora acrescente
mais este trecho de c7digo ao G994
'+ :enu "rinci"a$ +'
,menu 2
c$ear& botB
o0er#$o/& iddenB
bacAgroundEco$or& ,VSaB
marginEto"& @)".B
eigt& RT".B
#ontEsiNe& ).(emB
#ontE/eigt& bo$dB
co$or& /iteB
4
,menu u$ 2
margin& )B
"adding& )B
4
,menu u$ $i 2
5L5
#$oat& $e#tB
$istEst!$e& noneB
"adding& U".B
4
,menu u$ $i a&$inA, ,menu u$ $i a&0isited, ,menu u$ $i a&acti0e 2
"adding& U".B
te.tEdecoration& noneB
co$or& /iteB
4
,menu u$ $i a&o0er 2
bacAgroundEco$or& ,SMbB
co$or& /iteB
4
9alve o arquivo, atualize o navegador e vea como ficou4

<u$a, o nosso menu virou outro) Agora acrescente mais esse trecho de
c7digo4
'+ Artigo do b$og +'
5LC
.artigo R 2
te.tEdecoration& under$ineB
4
.artigo 2
margin& @)". ) @)". )B
4
.artigo a 2
co$or& b$acAB
4
.conteudo 2
"adding& @)".B
4
9alve o arquivo, atualize o navegador e vea como ficou4

&otou a mudana no artigo3
<or fim, acrescente mais esse trecho4
'+ Wormu$arios +'
5LI
#orm $abe$ 2
dis"$a!& b$ocAB
4
te.tarea 2
eigt& @))".B
4
t 2
te.tEa$ign& rigtB
"addingErigt& U".B
4
'+ Comentarios +'
.comentarios 2
borderEto"& @". so$id si$0erB
marginEto"& R)".B
4
.comentarios r 2
borderE/idt& )B
eigt& @".B
borderEto"& @". so$id ,dddB
4
9alve o arquivo. :eche o arquivo. Garregue no navegador o endereo do artigo4
tt"&''$oca$ost&()))'artigo'@'
E vea como ficou4
5LL

<ois bem, agora vea como est o nosso G99 depois de tudo4
bod! 2
#ontE#ami$!& aria$B
bacAgroundEco$or& ,eeeB
co$or& ,???B
4
@ 2
margin& @)". R)". @)". R)".B
4
R 2
margin& )B
#ontEsiNe& @.RemB
4
'+ La!out +'
,tudo 2
"osition& abso$uteB
5LK
bacAgroundEco$or& /iteB
margin& R)". ) R)". E?M)".B
/idt& ST)".B
$e#t& U)=B
border& @)". so$id ,aaaB
4
,to"o 2
#ontEsiNe& ?emB
margin& R)".B
4
,to"o ,#oto 2
#$oat& rigtB
bacAgroundEimage& ur$('media'#oto.j"g%B
bacAgroundEre"eat& noEre"eatB
bacAgroundE"osition& ER)". E?)".B
/idt& UT".B
eigt& UT".B
border& @". so$id ,VSaB
4
.cor"o 2 margin& R)". R)". ) R)".B 4
.roda"e 2
c$ear& botB
o0er#$o/& iddenB
bacAgroundEco$or& ,(MaB
margin& R)".B
#ontEsiNe& ).(emB
co$or& /iteB
"adding& @)".B
te.tEa$ign& centerB
4
5LM
.roda"e a 2
co$or& /iteB
4
'+ :enu "rinci"a$ +'
,menu 2
c$ear& botB
o0er#$o/& iddenB
bacAgroundEco$or& ,VSaB
marginEto"& @)".B
eigt& RT".B
#ontEsiNe& ).(emB
#ontE/eigt& bo$dB
co$or& /iteB
4
,menu u$ 2
margin& )B
"adding& )B
4
,menu u$ $i 2
#$oat& $e#tB
$istEst!$e& noneB
"adding& U".B
4
,menu u$ $i a&$inA, ,menu u$ $i a&0isited, ,menu u$ $i a&acti0e 2
"adding& U".B
te.tEdecoration& noneB
co$or& /iteB
4
5L6
,menu u$ $i a&o0er 2
bacAgroundEco$or& ,SMbB
co$or& /iteB
4
'+ Artigo do b$og +'
.artigo R 2
te.tEdecoration& under$ineB
4
.artigo 2
margin& @)". ) @)". )B
4
.artigo a 2
co$or& b$acAB
4
.conteudo 2
"adding& @)".B
4
'+ Wormu$arios +'
#orm $abe$ 2
dis"$a!& b$ocAB
4
te.tarea 2
eigt& @))".B
4
5L;
t 2
te.tEa$ign& rigtB
"addingErigt& U".B
4
'+ Comentarios +'
.comentarios 2
borderEto"& @". so$id si$0erB
marginEto"& R)".B
4
.comentarios r 2
borderE/idt& )B
eigt& @".B
borderEto"& @". so$id ,dddB
4
Ks macetes mais importantes do C!!
0esumindo a hist7ria, os macetes mais importantes do G99 para quem est
comeando s'o4
%(ite usar tabelas, com todas as suas foras, para o que n'o de fato uma
matriz de dados tabulares. Abra m'o disso somente quando n'o houver mais
alternativasN
Evite padding quando h um elemento dentro de outro. @ melhor que o
padding do elemento pai sea Aero e a margem do elemento filho faa o trabalho
do espaamentoN
#se o(erflo?: 4idden para garantir que aquele elemento n'o ficar
deformado quando algo dentro dele fizer aquela fora danada para sairN
#se clear: bot4 para garantir que aquele elemento vai ficar sozinho na linha
onde ele est posicionado.
#se float: left ou float: rig4t para posicionar um elemento % esquerda ou %
direita respectivamente, ainda que ele n'o sea inline. E faa isso com ele antes
dos demais elementos no c7digo R8.1. Esse o segredo do menu horizontal
em listaN
5LB
#se unidade "em" para tamanhos de fonteN
Gaso queira e$ibir somente uma parte retangular de uma imagem, crie uma
di( com a imagem em background, depois posicione a imagem onde quiser.
#0ustando o rodap;
Hom, agora que temos um G99 bem elaborado, vamos fazer um !ltimo auste.
&a pasta "templates" da pasta do proeto, abra o arquivo "rodape.4tml" para
edi'o e o modifique para ficar assim4
6di0 c$ass=>roda"e>7
<brigado "or "assar "or a3ui. Xo$te sem"re.
6'di07
9alve o arquivo. :eche o arquivo. Agora nosso rodap tem uma cara um pouco
mais de... rodap;)
!atisfeito com o (isualR mas de ol4o no OallAer
Ghegando em casa, Alatazan abria a porta quando uma bola metlica surgiu %
sua frente, do nada)
A bola metlica tinha uma fileira de dentes, braos compridos, olhos
esbugalhados e aquele sorriso habitual.
8charam) <oc poc) Wiiig poc poc)
Alatazan por fim confirmou o que vinha suspeitando h alguns dias. OallAer
estava ali, mais metlico do que nunca, e provavelmente aprontando.
+epois de dar um abrao destrambelhado em Alatazan, Hallzer foi ao fundo do
quarto e trou$e um robozinho pequeno, desses feitos por pesquisadores do <laneta
8erra. O robozinho n'o fazia muito mais do que girar para l e para c, e parecia
que Hallzer havia adotado,o como mascote, boneca ou algo do g(nero.
Hallzer, onde voc( conseguiu isso3
&o outro dia de manh', desiludido e sem seu sorriso habitual, Hallzer levou
Alatazan % casa de Gartola, de onde havia tirado o robX.
+epois da e$plica'o constrangedora e sem,graa de Alatazan, Gartola parecia
estar doido pra ele terminar com aquilo logo pra lhe mostrar algo mais interesse.
8 bom cara, mas olha, sabe em qu( esse robX foi programado3 <Fthon, cara)
'yt4on) Eu consegui isso l no laborat7rio da faculdade, com um cara meio
maluco, e trou$e pra dar uma olhada. 2amos tirar um tempo hoe pra fuar nisso
e ver o que a gente aprende aqui)
5KD
Captulo 1T: +m pouco de 'yt4on agora
Gartola estava e$citado com o fato do robX ter sido programado em <Fthon, mas
estava achando estranhas algumas linhas de c7digo que tinham erros de l7gica
incomuns.
Alatazan desconfiou logo4
OallAer, voc( andou futricando na programa'o desse robX3 2ai me dizer que
est me arrumando encrenca3
Hallzer bai$ou seus olhos, tratou de se esconder um pouco mais atrs da cama
de Gartola e assentiu arrependido.
2oc( est me dizendo que esse chimpanz metlico em forma de polvo,
programa em 'yt4on3 , Gartola perguntou um pouco espantado.
<rogramar n'o programa, sabe... mas ele adora me$er nas mesmas coisas que
eu estou me$endo...
Goitadinho, n'o fala assim com ele, ele seu maior f', Alatazan.
&ena disse isso mas Alatazan reagiu com aquela cara de *n'o piore as coisas,
por favor*.
Hom, ent'o vamos aproveitar esse momento pra falar sobre algumas coisas
fundamentais do 'yt4on. @ importante saber essas coisas antes de continuar
com o estudo do +ango, sabia3
'yt4onR uma linguagem maior >ue o D0ango...
#m dia desses Gartola comentou com Alatazan que "o 'yt4on ; a linguagem
>ue manda os paradigmas para o espaBo". @ bem provvel que Hallzer ouviu
isso, pois "mandar as coisas para o espao" uma e$press'o particularmente
especial para ele. O que acontece que Hallzer n'o compreende muito bem essa
coisa de metforas, figuras, interpretaAes e tal, e deve ter entendido que aquela era
a ferramenta ideal para um oba-oba.
&'o, n'o... n'o isso. O <Fthon n'o e$atamente uma linguagem recomendada
5K5
para quem gosta de gambiarras, muito pelo contrrio, ela indicada a pessoas que
gostam de se divertir programando, mas fazendo as coisas do eito certo.
.as de fato, o <Fthon rompe paradigmas, e que pode ser chamada tambm de
"linguagem multi@paradigmas".
Krientada a ob0etos ou funcionalJ
<Fthon as duas, mas tambm permite orienta'o a aspectos, programa'o
procedural e outras prticas de outros paradigmas.
<ara desenvolver em +ango usa,se muito funAes isoladas >paradigma
procedural?, defini'o e instanciamento de classes >orienta'o a obetos?,
decorators >orienta'o a aspectos e funcional?, etc.
.as ainda assim, o principal paradigma que o +ango trabalha no <Fthon, de
fato a programa'o orientada a ob0etos.
Interpretada ou CompiladaJ
O <Fthon tambm trabalha com ambos os paradigmas. Yuer proteger o c7digo3
1eve somente os arquivos .pyc. =sso vai dificultar o suficiente para quem quiser
e$plorar suas regras de neg7cio. Yuer trabalhar diretamente nos arquivos de
c7digo,fonte3 Hasta levar os arquivos .py.
#m c7digo escrito em <Fthon pode ser interpretado de vrias formas4
a forma tradicional, tecnicamente chamada C'yt4on, a forma como temos
trabalhado neste estudoN
o shell interativo do <Fthon, uma interpreta'o dinEmica em shell
semelhante ao prompt do .9,+O9, onde poss/vel declarar obetos, classes,
funAes e fazer outras coisas de forma on-lineN
a compila'o para classes Ua(a > arquivos .class ?, usando Uyt4on, para ser
e$ecutado em mquina virtual UVEN
a compila'o para bytecode .et, usando Iron'yt4on, para ser e$ecutado em
mquina virtual .&etN
e outras formas de compila'o eSou interpreta'o para dispositi(os de
eletrWnica e celulares.
Xindo?sR $inux ou EacJ
<Fthon tambm multi,paradigma nesse sentido. Ele roda em UindoTs, 1inu$,
.acO9, #ni$, 9olaris e outros sistemas operacionais menos conhecidos.
5KC
<ara saber de outras plataformas onde o <Fthon roda, vea esta pgina da Ueb4
tt"&''///."!ton.org'do/n$oad'oter'
Aqui, preciso manter alguns cuidados para evitar problemas ao, por e$emplo,
e$ecutar em um servidor 1inu$ um programa criado e testado em UindoTs.
As diferenas n'o s'o grandes, mas importante ficar de olho nelas. #m caso
clssico o do separador de caminhos de arquivos. &o UindoTs o separador uma
barra in(ertida > Z ?, nos demais uma barra comum > 2 ?. &este caso, voc( pode
usar sempre a barra comum ou o elemento os.sep.
.as raramente essas diferenas chegam a dar dores de cabea, pois o <Fthon
faz a maior parte para voc(.
CodificaB)o de caracteres do ar>ui(o
Em uma pasta qualquer, crie um novo arquivo com o nome
"testar&caracteres.py" com o seguinte c7digo dentro4
de# im"rimir_duas_0eNes(te.to%&
, Im"rime o te.to uma 0eN
"rint te.to
, Y a3ui 3ue im"rime outra 0eN
"rint te.to
im"rimir_duas_0eNes('Tarsi$a do Amara$'%
9alve o arquivo. 2 'rompt do E!@DK! >ou no Console do 1inu$?, localize a
pasta onde voc( salvou o arquivo e e$ecute4
"!ton testar_caracteres."!
9er e$ibida a seguinte mensagem de erro4
Wi$e >testar_caracteres."!>, $ine U
S!nta.Error& NonEASCII caracter '8.cM' in #i$e
testar_caracteres."! on $ine U,
but no encoding dec$aredB see tt"&''///."!ton.org'"e"s'"e"E
)RT?.tm$ #or detai$s
=sso acontece porque o seu comentrio da linha K possui um "Y" acentuado,
vea4
, Y a3ui 3ue im"rime outra 0eN
.esmo que salve o arquivo no formato +"8@I >o que recomendvel?, isso
5KI
n'o ir se resolver. @ preciso adicionar o seguinte c7digo ao arquivo, na primeira
linha4
, E+E coding& ut#E( E+E
Ou sea, agora o arquivo ficou assim4
, E+E coding& ut#E( E+E
de# im"rimir_duas_0eNes(te.to%&
, Im"rime o te.to uma 0eN
"rint te.to
, Y a3ui 3ue im"rime outra 0eN
"rint te.to
im"rimir_duas_0eNes('Tarsi$a do Amara$'%
9alve o arquivo. E$ecute novamente4
"!ton testar_caracteres."!
Agora vea o resultado4
Tarsi$a do Amara$
Tarsi$a do Amara$
=sso importante, pois o <Fthon foi criado em solo americano por um
4olandQs e utilizado por pessoas do mundo inteiro, o que inclui brasileiros,
gregos, russos, c4ineses, 0aponeses, coreanos, indianos, isrealenses e muitos
outros, cada qual com seus caracteres particulares e outros em comum.
<ortanto, o <Fthon deve suportar a todos eles, suas particularidades e aquilo que
h em comum entre eles.
%dentaB)o
Outra caracter/stica fundamental do <Fthon, que ele foi pensado para ser
compreendido pelo maior n!mero poss/vel de pessoas. =sso fez com que algumas
definiAes milenares fossem chutadas para o espao em busca de algo prtico, claro
e que audasse tudo isso de forma simptica >neste momento, OallAer soltou um
sorriso t'o largo que quase separou seu corpo em dois?. A grande sacada foi a
edentaB)o padronizada para todo o c7digo,fonte.
A edenta'o da linha muda quando esta faz parte de um bloco declarado na
linha anterior.
5KL
Olocos s'o sempre iniciados por uma linha que termina com o sinal de dois@
pontos > : ?.
2ea este c7digo novamente, por e$emplo4
, E+E coding& ut#E( E+E
de# im"rimir_duas_0eNes(te.to%&
, Im"rime o te.to uma 0eN
"rint te.to
, Y a3ui 3ue im"rime outra 0eN
"rint te.to
im"rimir_duas_0eNes('Tarsi$a do Amara$'%
O <Fthon segue as linhas do arquivo de cima para bai$o at encontrar a seguinte
linha4
de# im"rimir_duas_0eNes(te.to%&
Esta linha define uma nova fun'o, e inicia o bloco de c7digo que faA parte
dessa nova fun'o. +a/ em diante, as linhas s'o edentadas com Z espaBos da
esquerda para a direita, o que d uma leitura agradvel do c7digo para quem estava
l fora tomando um ar e chegou ali, coando a orelha direita, enquanto mastiga um
palito de dentes ainda do almoo.
A s!bita sensa'o esta4
9im, claro, entendi o que esse c7digo faz.
As linhas continuam edentadas at que uma delas volta % edenta'o anterior,
vea4
im"rimir_duas_0eNes('Tarsi$a do Amara$'%
Ou sea, nen4um espaBo [ es>uerda. =sso quer dizer que aquele bloco acabou,
aquele trecho de c7digo da fun'o durou enquanto a edenta'o estava l, com Z
espaBos ou mais % esquerda, mas agora que a edenta'o voltou ao estado inicial,
voltamos ao assunto anterior.
Gompreendido3
#se sempre m!ltiplos de Z espaBos >L, ;, 5C, etc.?. &unca utilize tabulaB)o,
pois isso seria desastroso para o cara do palito de dentes, para o seu substituto nas
frias ou para voc( mesmo, alguns dias depois. +se sempre Z espaBos para
edentar de bloco em bloco.
5KK
Con4ecendo o 'yt4on interati(o
Agora, v ao Eenu Iniciar e escolha a op'o "%xecutar 'rograma". Escreva
*pFthon* no campo e clique em "KD".
&o 1inu$, voc( pode e$ecutar o Console, digitar "pyt4on" e teclar E&8E0.
A anela de modo te$to do E!@DK! >ou do Console, no 1inu$? ser aberta com
um prompt assim4

<ois bem, este o 'yt4on interati(o. @ importante conhec(,lo, pois
constantemente fazemos tarefas de administra'o de proetos usando esta
ferramenta, que muito prtica tambm para o aprendizado.
"ipagem
&o <Fthon, a tipagem dos dados e obetos din\mica e forte.
"Din\mico" quer dizer que ao uma nova varivel, ou um parEmetro de uma
fun'o, n'o preciso informar qual o seu tipo, nem mesmo defini,la antes de us,
la. Hasta atribuir um valor a ela quando necessrio.
&o entanto, internamente todo valor baseado em algum tipo de dado, que por
sua vez uma classe. #ma vez que um valor atribu/do a uma varivel, ela passa a
se comportar da forma que a classe daquele valor foi definida para se comportar.
<or isso, ela "forte".
<ara ver como isso funciona, volte ao s4ell interati(o e digite a sequ(ncia de
comandos abai$o. Escreva somente as linhas iniciadas por "NNN ", e claro, ignore
o "NNN ", digitando somente o restante da linha.
777 nome = 'Leticia'
777 nome
5KM
'Leticia'
777 nome.__c$ass__
6t!"e 'str'7
777 t!"e(nome%
6t!"e 'str'7
&as linhas de c7digo acima, n7s fizemos o seguinte4
@. declaramos uma varivel "nome" com uma string /$eticia/N
R. escrevemos o nome da varivel para que seu valor original sea e$ibido
na linha de bai$o, ou sea4 /$eticia/N
?. na linha seguinte, informamos o atributo interno do <Fthon que retorna
a classe daquele obeto, e ele mostrou que o valor contido na varivel
"nome" um tipo bsico de string > "Mtype /str/N" ?N
L. e na !ltima linha usamos uma outra forma de fazer a mesma coisa da
linha anterior.
Agora faa algo semelhante, s7 que desta forma4
777 idade = R(
777 idade
R(
777 idade.__c$ass__
6t!"e 'int'7
2ea que o valor "FI" foi interpretado como n!mero inteiro > "Mtype /int/N" ?.
2ea esses outros4
777 nota = (.S
777 nota
(.TMMMMMMMMMMMMMM?
777 nota.__c$ass__
6t!"e '#$oat'7
777 mu$er = True
777 mu$er
True
777 mu$er.__c$ass__
6t!"e 'boo$'7
777 nota + idade
5K6
RV?.UMMMMMMMMMMMMS
777 idade + nota
RV?.UMMMMMMMMMMMMS
Import explcito e namespaces
Agora, depois de ver alguns tipos de dados bsicos, vamos partir para outro um
pouquinho mais comple$o. &o shell interativo, digite a seguinte sequ(ncia de
comandos4
777 #rom datetime im"ort date
777 oje = date.toda!(%
777 oje
datetime.date(R))(, @@, RV%
777 oje.__c$ass__
6t!"e 'datetime.date'7
Gomo pode ver, para trabalhar com datas, preciso importar um pacote
chamado "date", de dentro de outro pacote, chamado "datetime".
Importar um pacote ou obeto trata,se de fazer o <Fthon saber que quando
aquele elemento for citado, ele deve ser localizado em uma biblioteca diferente do
m7dulo em que voc( est agora, e diferente tambm da biblioteca built-in do
<Fthon, que carregada automaticamente.
R outras formas de se importar um pacote ou obeto, vea4
777 im"ort datetime
777 datetime.date.toda!(%
datetime.date(R))(, @@, RV%
Observe que aqui, n7s importamos o pacote "datetime" inteiro. Ent'o, para
us,lo, precisamos informar todo o caminho para a fun'o today-..
777 datetime = __im"ort__('datetime'%
777 datetime.date.toda!(%
datetime.date(R))(, @@, RV%
&este outro bloco, importamos o pacote "datetime" da mesma forma, s7 que
agora seu nome foi informado dentro de uma string. =sso !til para se importar
pacotes quando seus nomes ser'o conhecidos somente em tempo de e$ecu'o.
777 #rom datetime im"ort +
777 date.toda!(%
datetime.date(R))(, @@, RV%
5K;
J neste !ltimo bloco, importamos todos os elementos de "datetime", o que
inclui tambm o elemento "date", ent'o o usamos logo em seguida.
Acontece, que Alatazan sabe que quando se traz uma manada de elefantes de
uma regi'o da floresta, e outra manada de elefantes de outra regi'o da floresta, mas
n'o se usa nem um papelzinho para dizer que onde vieram, ent'o a baguna est
definitivamente... feita)
E quando se usa esse famigerado "from algum&lugar import ]" e outro "from
outro&lugar import ]", acontece a mesma coisa4 voc( n'o sabe quem veio, e
tambm n'o sabe de onde um elemento espec/fico veio, o que muito ruim.
<ortanto n'o aconselhvel o uso de "import ]", a menos que sea em um caso
espec/fico e simples.
=sso se chama "namespace".
DeclaraB)o de classes
2amos agora declarar uma classe no shell3 <ois ent'o digite as linhas de
c7digo abai$o. As linhas iniciadas com "... " s'o blocos, portanto, use os Z espaBos
para edentar o bloco.
777 c$ass Pessoa&
... nome = 'Leticia'
... idade = R(
... nota = (.S
... mu$er = True
... , nao se es3ueca da edentacao "ara continuar o b$oco
... de# andar(se$#, "assos=@)%&
... i# se$#.idade 7 @R)&
... "rint 'Nao #oi "ossi0e$'
... e$se&
... "rint 'Andou =d "assosG'="assos
...
777
<u$a, fizemos um bocado de coisas a/.
<rimeiro, voc( deve ter notado que a cada in/cio de um novo bloco, mais L
espaos devem acrescentar % edenta'o e o contrrio tambm verdadeiro.
Em segundo, declaramos alguns atributos para a classe >nome, idade, nota e
mul4er? com valores iniciais. =sso n'o obrigat7rio, mas d uma clareAa
5KB
aliviadora para a>uele mesmo cara do palito.
Em terceiro, voc( deve notar que, no shell interativo, quando um bloco tem um
espao em branco entre suas linhas >para manter a esttica e facilidade de leitura?,
este deve seguir a mesma edenta'o, ustamente porque sen'o ele vai pensar que
voc( acabou de fechar o bloco, o que n'o a sua inten'o naquele momento. .as
essa preocupa'o n'o necessria quando se est escrevendo c7digo em um
arquivo .py.
!elf explcito na declaraB)o de m;todos
<or !ltimo, declaramos o mtodo andar-selfR passosP1*.. <ara ser um mtodo
preciso ter self como primeiro parEmetro e ser uma fun'o. O parEmetro passos
possui um valor default, ou sea, caso n'o sea especificado, ele assumir o valor
1*.
Agora escreva as seguintes linhas de c7digo na sequ(ncia4
777 m!ce$$ = Pessoa(%
777 m!ce$$.nome = ':!ce$$'
777 m!ce$$.idade = @U
777 m!ce$$.nome
':!ce$$'
777 m!ce$$.idade
@U
777 m!ce$$.andar(%
Andou @) "assosG
777 m!ce$$.andar(@U%
Andou @U "assosG
<rimeiro, instanciamos a classe 'essoa e atribu/mos essa instEncia % varivel
"myc4ell".
+epois atribu/mos valores a seus atributos, para modificar os valores iniciais.
E por !ltimo, e$ecutamos o mtodo andar.
&a primeira e$ecu'o do mtodo, n'o informamos um valor para o parEmetro
passos, ent'o o valor assumido foi 1*. 2ea4
777 m!ce$$.andar(%
Andou @) "assosG
&a segunda e$ecu'o, informamos um valor para o parEmetro. Observe que o
parEmetro self foi completamente ignorado. =sso porqu( ele deve ser informado
5MD
somente na declara'o, e n'o na e$ecu'o do mtodo.
777 m!ce$$.andar(@U%
Andou @U "assosG
#tribuiB)o de m;todo e inicialiAador de classe
<ois agora vamos brincar um pouco com programa'o funcional e atribuir um
mtodo especial de inicialiAaB)o % classe 'essoa, vea4
777 de# inicia$iNador(se$#, nome, idade, nota=None, mu$er=None%&
... se$#.nome = nome
... se$#.idade = idade
... se$#.nota = nota or se$#.nota
... se$#.mu$er = mu$er is not None or se$#.mu$er
...
777 Pessoa.__init__ = inicia$iNador
2ea s74
<rimeiro, declaramos uma nova fun'o, chamada "inicialiAador", com os
atributos self, nome, idade, nota e mul4er. Os dois !ltimos possuem valores
default.
A seguinte linha diz, em outras palavras4 *o atributo "self.nota" deve receber o
valor do parEmetro "nota" somente se este tiver um (alor (lido, do contrrio,
recebe o seu pr7prio valor para continuar tudo como est*.
&este caso, um (alor (lido um valor (erdadeiro. <ara o <Fthon, os valores
*, 8alse, one, //, -., ^_ e 57 n'o s'o verdadeiros.
... se$#.nota = nota or se$#.nota
J na linha abai$o, a coisa bem parecida, mas o valor do parEmetro "mul4er"
s7 ser atribu/do ao atributo "self.mul4er" caso ele n)o se0a one, ou sea, seu
valor default.
... se$#.mu$er = mu$er is not None or se$#.mu$er
@ importante perceber aqui, que o que estamos fazendo atribuir os valores
informados para os parEmetros opcionais somente se estes foram realmente
informados, pois one seu valor default, e indica que ele n)o foi informado.
&a segunda parte, atribu/mos a fun'o % classe, como se fosse um atributo, de
nome &&init&&, mas como ela uma fun'o, o <Fthon a atribui como m;todo.
Agora vea a seguir4
777 ana = Pessoa(%
5M5
TracebacA (most recent ca$$ $ast%&
Wi$e >6stdin7>, $ine @, in 6modu$e7
T!"eError& inicia$iNador(% taAes at $east ? arguments (@ gi0en%
&o c7digo acima, ao instanciar a classe 'essoa, desta vez n'o foi poss/vel, pois
o seu inicialiAador obriga que pelo menos os parEmetros sem (alor default seam
informados.
777 ana = Pessoa('Ana Pau$a', (%
Agora fizemos do eito certo, atribuindo o nome /#na 'aula/ e a idade I.
Ao imprimir os valores dos atributos na tela, eles s'o e$ibidos, at mesmo o
atributo "mul4er", que permaneceu com seu valor default.
777 ana.nome
'Ana Pau$a'
777 ana.idade
(
777 ana.mu$er
True
<ara finalizar essa sequ(ncia, voc( deve saber que poderia informar o
inicialiAador com qualquer outro nome, ou poderia , o que o mais indicado
sempre , simplesmente declarar o mtodo da forma convencional, assim por
e$emplo4
c$ass Pessoa&
nome = 'Leticia'
idade = R(
nota = (.S
mu$er = True
de# __init__(se$#, nome, idade, nota=None, mu$er=None%&
se$#.nome = nome
se$#.idade = idade
se$#.nota = nota or se$#.nota
se$#.mu$er = mu$er is not None or se$#.mu$er
de# andar(se$#, "assos=@)%&
i# se$#.idade 7 @R)&
"rint 'Nao #oi "ossi0e$'
5MC
e$se&
"rint 'Andou =d "assosG'="assos
K resto tamb;m de(e ser explcito
O <Fthon segue a ideia de que tudo deve ser posto %s caras, livre, e muito, muito
e$pl/cito. #se nomes de variveis, classes e funAes, todos e$pl/citos. Gomentrios
e$pl/citos, etc... tudo deve ser claro... e falando nessas coisas, tambm
recomendvel...
'adr)o de nomenclatura
... que as variveis tenham seus nomes em cai$a bai$a >letras min!sculas?, com
as palavras separadas por underscore > [ ?, assim4
nome = ':arta'
data_nascimento = None
... que funAes e mtodos seam verbos, assim4
de# andar_"ara_#rente(%&
"rint nome, 'andou'
... e que as classes tenham nomes no singular, com a primeira letra de cada
palavra em cai$a alta, assim4
c$ass PessoaWisica&
nome = 'Leticia'
Comentrios
... e que comentrios podem ser feitos assim4
, $ina comentada 3ue sera ignorada da mesma #orma
, 3ue esta outra $ina
ou assim4
>>>$ina comentada 3ue sera ignorada da mesma #orma
3ue esta outra $ina>>>
E muito aconselhvel que todas as funAes e classes tenham um comentrio no
in/cio do bloco, assim4
c$ass Pessoa&
>>>C$asse "ara atribuicao a "essoas do sistema>>>
nome = None
5MI
idade = R)
<ois ao chamar a fun'o 4elp-. para aquela classe ou fun'o no shell interativo,
aquele comentrio ser interpretado como a documentaB)o da classe. 2ea com
seus pr7prios olhos4
777 e$"(Pessoa%
Le$" on c$ass Pessoa in modu$e __main__&
c$ass Pessoa
D C$asse "ara atribuicao a "essoas do sistema
D
D Data and oter attributes de#ined ere&
D
D nome = None
D idade = R)
)o ; fantsticoJ
8unBes dir-. e 4elp-.
Alis, falando em fun'o 4elp-., ela uma forma muito bacana de aprender
<Fthon, vea4
777 im"ort datetime
777 e$"(datetime%
Le$" on bui$tEin modu$e datetime&
NA:E
datetime E Wast im"$ementation o# te datetime t!"e.
WILE
(bui$tEin%
CLASSES
__bui$tin__.object
date
datetime
time
5ML
EEEE cortamos a3ui "ois a documentaZ[o deste "acote P e.tensa
Ou este4
777 im"ort ur$$ib
777 e$"(ur$$ib%
Le$" on modu$e ur$$ib&
NA:E
ur$$ib E <"en an arbitrar! -;L.
WILE
c&8"!tonRU8$ib8ur$$ib."!
DESC;IPTI<N
See te #o$$o/ing document #or more in#o on -;Ls&
>Names and Addresses, -;Is, -;Ls, -;Ns, -;Cs>, at
tt"&''///./?.org'"ub'JJJ'Addressing'<0er0ie/.tm$
See a$so te LTTP s"ec (#rom /ic te error codes are
deri0ed%&
>LTTP E L!"erte.t Trans#er Protoco$>, at
EEEE cortamos deno0o
=sso muito !til e auda bastante.
E t'o !til quanto a fun'o 4elp-. a fun'o dir-., vea
777 dir(Pessoa%
\'__doc__', '__init__', '__modu$e__', 'andar', 'idade', 'mu$er',
'nome', 'nota']
A fun'o dir-. retorna em uma lista todos atributos e mtodos daquela instEncia,
e isso vale tambm para classes.
<ortanto, se voc( quer saber quais atributos e mtodos a string /Oeatles/ possui,
faa isto4
777 dir('Ieat$es'%
\
5MK
'__add__', '__c$ass__', '__contains__', '__de$attr__',
'__doc__', '__e3__', '__ge__', '__getattribute__', '__getitem__',
'__getne/args__', '__gets$ice__', '__gt__', '__as__',
'__init__', '__$e__', '__$en__', '__$t__', '__mod__', '__mu$__',
'__ne__', '__ne/__', '__reduce__', '__reduce_e.__', '__re"r__',
'__rmod__', '__rmu$__', '__setattr__', '__str__', 'ca"ita$iNe',
'center', 'count', 'decode','encode', 'ends/it', 'e."andtabs',
'#ind', 'inde.', 'isa$num', 'isa$"a', 'isdigit', 'is$o/er',
'iss"ace', 'istit$e', 'isu""er', 'join', '$just', '$o/er',
'$stri"', '"artition', 're"$ace', 'r#ind', 'rinde.', 'rjust',
'r"artition', 'rs"$it', 'rstri"', 's"$it', 's"$it$ines',
'starts/it', 'stri"', 's/a"case', 'tit$e', 'trans$ate', 'u""er',
'N#i$$'
]
E agora, sabendo dos atributos e mtodos dessa string, volte ao 4elp-.4
777 e$"('Ieat$es'.u""er%
Le$" on bui$tEin #unction u""er&
u""er(...%
S.u""er(% E7 string
;eturn a co"! o# te string S con0erted to u""ercase.
&ovamente4 o 'yt4on ; fantstico)
Com muita empolgaB)oR rumo ao deploy
Alatazan ficou fascinado, e Hallzer, como era de se esperar, comeou a formular
suas aventuras futuras.
<u$a, evidentemente o <Fthon mais do que isso, mas s7 em saber disso
muito do que fizemos e vamos fazer nos pr7$imos dias se esclareceu de forma
t'o... pythonica)
.eu camarada, muito, muito bacana programar em <Fthon. E o mais
interessante que as coisas s'o realmente simples, vea que muito fcil casar
classes com funAes de formas variadas. @ por isso que e$istem tantos
frameworks criados em <Fthon)
5MM
Gartola austou o volume de seu i<od e prosseguiu4
2amos resumir a parada4
<Fthon multi,paradigma4 orientado a ob0etosR orientado a aspectosR
proceduralR funcional e outrosN
pode ser compilado ou interpretadoN
roda em qualquer sistema operacional que sea popularN
<Fthon unicode, por isso, preciso informar a codifi'o do arquivo se
for usar caracteres especiaisN
<Fthon constr7i blocos por edenta'o, sempre de L em Z espaBosN
O s4ell interati(o uma m'o,na,roda em muitas situaAesN
a tipagem de dados no <Fthon din\mica e forteN
faa tudo explcito e use namespacesN
classes tambm s'o obetos, e mtodos devem ser declarados sempre com
self sendo o primeiro parEmetroN
funAes comuns podem ser transformadas em mtodosN
comentrios em string no in/cio do bloco s'o a documentaB)o daquela
fun'o ou classeN
as funAes 4elp-. e dir-. abrem as cortinas para o esclarecimento.
<ronto) Agora com conceitos bsicos sobre R8.1, G99 e <Fthon, podemos
seguir adiante. &o pr7$imo cap/tulo, vamos fechar a primeira itera'o e partir para
mais aventuras)
5M6
Captulo 1Z: #0ustando as coisas para colocar no ar
&esse dia, caiu uma chuva daquelas que n'o t(m nada
a ver com o tempo nem com a poca.
Alatazan nem sabia disso, pois estava no planeta h
poucas semanas. .as ele sentiu um gostinho de vingana
quando viu os panfletos de gs, supermercado, m'e,de,
santo e outros mais derretendo na cai$inha de correios.
+efinitivamente4 se havia uma coisa chat/ssima na
8erra eram esses malditos panfletos.
Alatazan compreendeu mais rpido que ningum a ideia de "colocar no ar".
Em \atara, h empresas de publicidade que colocam milhares de propagandas no
ar todos os dias.
O problema que essas propagandas s'o pequenos robWs que se parecem com
moscas, e ficam em grupos de K ou M por ali, perto dos portAes como se n'o
quisessem nada, assobiando e praticando um voo manado. Yuando o infeliz
morador sai de sua casa, atacado por eles com as mais variadas propagandas. -s
vezes essas pessoas entram em ataque de nervos e passam um bom tempo tentando
acertar os robXs com tapas ou ornais, mas nunca se resolve, e no outro dia a
mesma coisa.
O pai de Alatazan trabalha na fbrica onde esses robXs s'o feitos, na se'o onde
eles s'o treinados, e ali eles usam uma capa frgil, resistente a coisa nenhuma.
+epois do treinamento eles recebem uma capa resistente e fle$/vel, que n'o
permite que se derretam quando a chuva cai.
97 depois disso, podem ser colocados no ar.
Vamos agora preparar o pro0eto
<ara enviar o proeto a um servidor e coloc,lo no ar, importante fazer
algumas modificaAes para isso. &o servidor, ele deve se comportar de forma mais
leve, sem recursos de depuraB)o e outras coisinhas.
5M;
Ent'o, m'o na massa)
Antes de mais nada, e$ecute seu proeto clicando duas vezes sobre o arquivo
"executar.bat" da pasta do proeto.
<rimeiro de tudo, abra o arquivo "settings.py" da pasta do proeto para edi'o.
2amos pensar as settings do proeto na seguinte divis'o4

R algumas settings que s'o muito relativas ao ambiente ao qual seu proeto
est no momento. 2amos dar o e$emplo mais simples4 o estado de D%O+9. Esta
setting s7 deve ter valor "rue em ambientes de teste ou desen(ol(imento, nunca
em produ'o.
Outras settings s'o resultado de uma defini'o fi$a, somada a outra setting do
caso citado acima. #m bom e$emplo a setting E%DI#&,KK" que seria sempre
a mesma pasta "media" da pasta do proeto, mas a pasta do proeto pode estar em
um caminho no ambiente de desenvolvimento e em outro no servidor.
E h ainda as settings que dificilmente mudam, como I!"#$$%D&#''! por
e$emplo.
A defini'o de quais settings s'o fle$/veis e quais n'o o s'o variam de acordo
com o proeto, mas em geral h um ponto divisor no arquivo "settings.py" que se
adapta % maioria dos casos.
5MB
1ocalize a seguinte linha no arquivo "settings.py"4
-SE_I@(N = True
&a maioria dos proetos, esta a !ltima linha de um grupo de settings que
variam muito de acordo com a situa'o atual do proeto. Abai$o desta linha est'o
aquelas settings que se austam a elas, ou que n'o se austam a nada.
<ortanto, vamos acrescentar um novo trecho de c7digo abai$o dessa linha4
#rom $oca$_settings im"ort +
9alve o arquivo e v % anela do E!@DK! >ou Console, no caso do 1inu$? onde
o proeto est rodando. 2ea o que aconteceu4

O erro que surgiu este4
Error& Can't #ind te #i$e 'settings."!' in te director!
containing 'manage."!'.
It a""ears !ou'0e customiNed tings.
Hou'$$ a0e to run djangoEadmin."!, "assing it !our settings
modu$e.
(I# te #i$e settings."! does indeed e.ist, it's causing an
Im"ortError someo/.%
Ou sea, nosso proeto caiu e parou de funcionar, porque houve um erro do tipo
Import%rror no arquivo "settings.py". =sso aconteceu porque o arquivo
importado "local&settings.py" n'o foi encontrado.
<ois agora volte ao arquivo "settings.py" e modifique o trecho de c7digo que
voc( acrescentou para ficar assim4
tr!&
#rom $oca$_settings im"ort +
56D
e.ce"t Im"ortError&
"ass
9alve o arquivo. E$ecute o proeto novamente, clicando duas vezes sobre o
arquivo "executar.bat" da pasta do proeto.
&o <Fthon, o try2except um recurso que permite que voc( faa uma tentativa,
e caso essa tentativa resulte em erro, voc( pode tratar esse erro sem que seu
softTare sea afetado ou paralisado.
Em outras palavras n7s tentamos importar todas as settings do arquivo
"local&settings.py", mas caso ocorra algum erro de importaB)o > =mportError ?, a
situa'o ser ignorada e o interpretador do <Fthon deve seguir adiante como se
nada tivesse acontecido. 2ea que apenas erros de importa'o est'o sendo
suportados aqui, ou sea, qualquer outro tipo de erro ter o comportamento padr'o
de levantar uma e$ce'o.
O erro de importa'o mais comum o de o arquivo n'o e$istir.
O racioc/nio o seguinte4 todas as settings do arquivo "local&settings.py"
ser'o importadas, substituindo o valor das settings que est'o acima desse trecho de
c7digo. 9e elas n'o tiverem sido declaradas no "local&settings.py", permanecem
como est'o.
Agora, na pasta do proeto, crie um novo arquivo chamado "local&settings.py"
com o seguinte c7digo dentro4
im"ort os
P;<^ECT_;<<T_PATL = os."at.dirname(os."at.abs"at(__#i$e__%%
L<CAL = True
DEI-_ = True
TE:PLATE_DEI-_ = DEI-_
DATAIASE_EN_INE = 's3$ite?'
DATAIASE_NA:E = os."at.join(P;<^ECT_;<<T_PATL,'meu_b$og.db'%
Estas s'o as settings que fatalmente ser'o modificadas quando o site for levado
para o servidor, portanto, ao traz(,las para c, garantimos que na mquina local elas
permanecer'o como est'o.
9alve o arquivo. :eche o arquivo.
Agora de volta ao arquivo "settings.py", localize esta linha4
DEI-_ = True
565
.odifique,a para ficar assim4
DEI-_ = Wa$se
E acima dela, acrescente a seguinte linha4
L<CAL = Wa$se
Ao mudar a setting D%O+9 para 8alse, desativamos o estado de depuraB)o
do proeto em suas configuraAes padr'o, mas elas permanecer'o funcionando
localmente, pois no arquivo "local&settings.py" elas foram mantidas como
estavam.
O", por agora isso suficiente.
9alve o arquivo. :eche o arquivo.
Agora abra o arquivo "urls.py" da pasta do proeto para edi'o e localize o
seguinte techo de c7digo4
(r'*media'(.+%1', 'django.0ie/s.static.ser0e',
2'document_root'& settings.:EDIA_;<<T4%,
@ a nossa #01 para arquivos estticos, certo3 ,emo(a esse trecho de c7digo.
Agora ao final do arquivo, acrescente as seguintes linhas4
i# settings.L<CAL&
ur$"atterns 9= "atterns('',
(r'*media'(.+%1', 'django.0ie/s.static.ser0e',
2'document_root'& settings.:EDIA_;<<T4%,
%
O que fizemos a/ foi o seguinte4 a #01 /1media2/ s7 deve e$istir se o proeto
estiver em mquina local, ou sea, na sua mquina, em ambiente de
desenvolvimento.
=sso importante, pois o +ango n)o foi feito para servir arquivos estticos em
servidores. &o servidor esta tarefa deve ser dei$ada para um softTare que foi
criado para isso4 um ser(idor ?eb, como o #pac4e, 1ighttpd, ==9 ou outro.
Agora o arquivo urls.py ficou assim4
#rom django.con#.ur$s.de#au$ts im"ort +
#rom django.con# im"ort settings
, -ncomment te ne.t t/o $ines to enab$e te admin&
#rom django.contrib im"ort admin
admin.autodisco0er(%
56C
#rom b$og.mode$s im"ort Artigo
#rom b$og.#eeds im"ort -$timosArtigos
ur$"atterns = "atterns('',
(r'*1', 'django.0ie/s.generic.date_based.arci0e_inde.',
2'3uer!set'& Artigo.objects.a$$(%,
'date_#ie$d'& '"ub$icacao'4%,
(r'*admin'(.+%', admin.site.root%,
(r'*rss'(5P6ur$7.+%'1',
'django.contrib.s!ndication.0ie/s.#eed',
2'#eed_dict'& 2'u$timos'& -$timosArtigos44%,
(r'*artigo'(5P6artigo_id78d9%'1', 'b$og.0ie/s.artigo'%,
(r'*contato'1', '0ie/s.contato'%,
(r'*comments'', inc$ude('django.contrib.comments.ur$s'%%,
%
i# settings.L<CAL&
ur$"atterns 9= "atterns('',
(r'*media'(.+%1', 'django.0ie/s.static.ser0e',
2'document_root'& settings.:EDIA_;<<T4%,
%
9alve o arquivo. :eche o arquivo.
A divis'o que trabalhamos no arquivo "settings.py", que voc( pXde observar
no diagrama, simples de se fazer e poderosa. <ois seguindo essa linha de
racioc/nio poss/vel n'o s7 configurar o proeto para diferenciar o ser(idor em
produB)o de seu ambiente de desen(ol(imento, como !til tambm para
ambientes de 4omologaB)o e testes, situaAes de um proeto em mais de um
ser(idor ou de mSltiplos sites em um s7 proeto.
8ire um tempo para pensar nisso, observe o arquivo "settings.py" com aten'o
e note aquilo que poderia variar em situaAes distintas. 9e for necessrio, mova a
setting deseada para antes ou depois do trecho de c7digo que importa o m7dulo
"local&settings.py".
Agora, para concluir, abra novamente o arquivo "settings.py" do proeto e
localize a seguinte linha4
56I
;<<T_-;LC<NW = 'meu_b$og.ur$s'
Agora a modifique para ficar assim4
;<<T_-;LC<NW = 'ur$s'
Esta modifica'o recomendvel, pois assim seu proeto trabalha de uma forma
transparente em rela'o % 'L"HK'#"H , o conunto de pastas reconhecidos
pelo <Fthon em sua mquina virtual para encontrar pacotes e m7dulos. +esta
forma, quando seu proeto for lanado ao servidor, vamos adicionar a pasta do
proeto % 'L"HK'#"H e tudo estar resolvido.
9alve o arquivo. :eche o arquivo.
<ronto. Os primeiros passos para levar o proeto ao servidor s'o esses.
Vamos adianteJ
Alatazan perguntou, s7 pra confirmar4
Ent'o o proeto tem comportamentos diferentes, dependendo se est no
servidor ou em minha mquina local3
Ao que Gartola respondeu4
=sso, e h um grupo de settings potencialmente adaptveis a essas situaAes
diferentes, relacionadas a caminhos de pastas, modo de depura'o e outras
coisas assim...
E tem tambm aquelas que s'o fle$/veis, pois recebem valores somados a
valores de settings modificadas em linhas de c7digo anteriores ou no arquivo
"local&settings.py".
<or !ltimo, h aquelas que dificilmente v'o se modificar, pois est'o na
estrutura do proeto, como EIDD$%X#,%&C$#!!%! ou
I!"#$$%D&#''! por e$emplo.
1embrando que o arquivo "settings.py" deve permanecer com as
configuraAes ideais para o proeto, ou sea, as que ser'o usadas caso o arquivo
"local&settings.py" n'o e$ista.
O que voc( precisa ficar ligado que, ao levar o seu proeto para o servidor,
o arquivo "settings.py" dever permanecer id(ntico, sem alteraAes, pois elas
devem ser feitas apenas no arquivo "local&settings.py". 9e ao levar seu proeto
para o servidor, voc( fizer mudanas em outras partes do c7digo, muito
provvel que estea no caminho errado. )o se es>ueBa disso<
O bate,bola de Gartola e &ena resumiu rapidamente o aprendizado do dia, e
Alatazan notou aqui uma diferena fundamental de hoe para os dias anteriores4
agora estavam entrando em uma fase mais profissional da coisa.
56L
Captulo 1C: Infinitas formas de se faAer deploy
<r7$imo a onde Alatazan viveu sua infEncia h uma cidade chamada
`onnibagga, que foi constru/da dentro de uma ilha, no meio de um lago.
+evido % sua popula'o ser e$tremamente din\mica, atravs dos sculos
deAenas de pontes foram constru/das para atravessar o lago at; a il4a. Raviam
pontes compridas, pontes curtas, pontes gratuitas, pontes com pedgio, pontes
bonitas e feias, resistentes e frgeis, largas e estreitas.
#m dia um homem sugeriu que se fossem atravessadas todas as pontes em
sequ(ncia, entrando e saindo da cidade, seria poss/vel desenhar um girassol com o
traado do percurso. Acontece que em \atara n'o e$istem girass7is e ningum
compreendeu qual era o fundamento para tal sugest'o.
O homem foi ent'o contratado pela prefeitura para construir mais pontes por um
lucro maior desde que parasse de falar nessa ideia, e assim ele realmente parou com
isso, construiu muitas pontes e com o dinheiro fez uma viagem transatlEntica ,
apesar de l tambm n'o haver um AtlEntico para atravessar.
#s muitas maneiras de se colocar um site no ar
R diversos caminhos , talvez infinitos , para se colocar um site no ar. <orque
para isso necessrio combinar uma srie de passos que todos eles possuem
diversas alternativas.
56K

&a ilustra'o acima est'o dispostos os elementos de um deploF bsico. <ara
cada um desses passos h alternativas variadas para escolher, dependendo da
situa'o e prefer(ncia dos desenvolvedores e servio de hospedagem.
As cai$as em verde >!oft?are de ,epositGrio e Controle de Verses, 8"' e
8abric? s'o caminhos os quais voc( vai usar para levar os arquivos do proeto para
o servidor. Gada um deles se adequa a uma realidade diferente.
As cai$as em rosa >!oft?are ser(idor ?eb, Cac4e e Oanco de Dados?, s'o
softTares que normalmente s'o instalados pelo servio de hospedagem em seu
servidor, portanto, caso contrate um servio de hospedagem muito provvel que
esses softTares v(m instalados e configurados.
As cai$as em larana >Interface com o 'yt4on2D0ango e 'yt4onR D0ango e
bibliotecas adicionais? s'o softTares que >e$ceto pelo <Fthon em servidores
1inu$? normalmente n'o v(m instalados nos servidores e provavelmente ter'o de
ser instalados e configurados por voc( mesmo.
E as cai$as em azul >#r>ui(os estticos e 'ro0eto do site? s'o os arquivos de
seu proeto. <ortanto, pelo menos esses arquivos voc( ter de levar para o servidor
para ter seu site no ar.
56M
#mbiente de desen(ol(imento
9eu ambiente de desenvolvimento >ou de sua equipe? deve estar preparado para
fazer testes e desenvolvimento local e uma ferramenta para enviar seus arquivos
para o servidor, que pode ser de um dos I tipos a seguir.
!oft?are de ,epositGrio e Controle de Verses
Yuando se trabalha com o proeto em apenas um servidor, especialmente
quando h mais de uma pessoa envolvida no desenvolvimento do site,
recomendado que se use uma ferramenta de repositGrio e controle de (erses.
Os e$emplos mais populares desse tipo de softTare s'o4
Vit
9ubversion
Hazaar
.ercurial
A recomenda'o para a maioria dos casos o 9it, atualmente a ferramenta com
maior fle$ibilidade e performance dentre as conhecidas no mercado. E alm disso,
livre e gratuita.
8"'
O uso do :8< tem se tornado cada vez menos recorrente devido % falta de
controle e dificuldade para se trabalhar em equipe. Ainda assim, a ferramenta
mais simples e presente nos servidores, conhecida pela maior parte dos
desenvolvedores.
O fato que de uma ou outra forma, nunca se dei$a de usar o :8<, mas seu uso
passa a ser para situaAes de casos isolados ou emergenciais.
8abric
<or !ltimo, a mais poderosa op'o para fazer deploF de proetos em +ango se
chama 8abric. 2oc( pode conseguir mais detalhes sobre ele em seu site oficial4
tt"&''///.nongnu.org'#ab'
9eu uso se resume a construir um pequeno script, chamado de fabfile, que
determina as regras para se atualizar servidores em grande n!mero, realizando
algumas tarefas relacionadas a isso. &'o se trata de uma op'o vantaosa para a
maioria do sites que est'o presentes em somente um servidor, mas para ambientes
mais comple$os se trata de uma grande vantagem.
566
!oft?are ser(idor ?eb
Os servidores Teb se tratam de softTares que escutam por uma porta H""' ou
H""'! >geralmente portas I* e ZZT, respectivamente? e servem aos navegadores
com arquivos e conte!do dinEmico. 8rata,se de um dos elementos mais
fundamentais neste processo. @ imposs/vel evitar o uso de algum tipo de servidor.
.as h diversos tipos, versAes e formas de configur,los. Os mais populares
s'o4
Apache
&gin$
1ighttpd
.icrosoft ==9
&ormalmente as diferenas mais comuns que se atribui entre esses servidores
s'o4
#pac4e o mais robusto, mais popular e mais compat/vel deles,
especialmente quando combinado com outros softTares livres.
ginx relativamente novo, muito leve e rpido e trabalha com um cache
pr7prio de conte!do. &o entanto escasso de documenta'o.
$ig4ttpd e$celente para servir arquivos estticos e :astGV=, possui uma
forma de configura'o bastante fle$/vel e tambm muito leve.
Eicrosoft II! o mais compat/vel com tecnologias da linha .icrosoft.
Entretanto o mais limitado quando se refere % combina'o com softTares
livres, possui uma estrutura fechada e diversos problemas de segurana.
Gada um deles possui uma forma diferente de se configurar para trabalhar com
o D0ango. &o pr7$imo cap/tulo vamos trabalhar a configura'o do Apache, o mais
popular e comum deles.
Oanco de Dados
E$istem diversos bancos de dados. O +ango compat/vel oficialmente com K4
.F9Y1
<ostgre9Y1
9Y1ite
Oracle
.icrosoft 9Y1 9erver
56;
Os primeiros tr(s s'o livres, sendo que o .F9Y1 e <ostgre9Y1 s'o mais
indicados para servidores em produ'o, pois s'o poderosos e possuem uma
performance relativamente superior aos demais. Alm disso s'o plenamente
compat/veis com outros softTares livres.
O 9Y1ite mais indicado para ambientes de desenvolvimento, por ser muito
simples e leve, mas n'o possui uma srie de recursos deseveis para servidores.
J o Oracle e .9 9Y1 9erver s'o softTares proprietrios, que dispAem de
versAes gratuitas mas limitadas. 8ambm s'o menos compat/veis com softTares
livres.
&o pr7$imo cap/tulo vamos trabalhar na configura'o de um servidor com
.F9Y1.
Cac4e
O servio de Gache em um servidor pode variar muito. .uitos servidores s'o
oferecidos por empresas de hospedagem com um softTare de cache, como os
seguintes4
9quid
2arnish
memcached
Ainda que figurem como ferramentas para cache, os tr(s softTares citados
acima possuem caracter/sticas e aplicaAes diferentes.
R ainda outras formas de fazer cache no +ango, usando banco de dados ou
uma pasta do HD. .as vamos trabalhar a instala'o do pr7$imo cap/tulo com
memcac4ed, a mais indicada para esse caso.
Interface com o 'yt4on2D0ango
<ara que o servidor Teb se comunique com o seu proeto em +ango, preciso
ter uma interface, que possibilita ao servidor o recon4ecimento de softTare escrito
em <Fthon, que o caso de proetos em +ango.
As formas mais comuns de se fazer isso s'o4
mod[pFthon
U9V=
:astGV=
Gada um deles possui um mtodo de trabalho diferente, e sua aplica'o varia de
56B
acordo com o caso.
A maior parte dos servios de hospedagem compartil4ada >quando um mesmo
servidor compartilhado por vrios clientes? feita usando 8astC9I, mas o
crescimento do U9V= nesse nicho tem sido uma constante. &este caso, usa,se o
m7dulo mod&re?rite do Apache ou funcionalidades semelhantes em outros
servidores Teb.
J a maior parte dos ser(idores dedicados e ser(idores (irtualiAados s'o
trabalhados usando mod&pyt4on, mas da mesma forma, o crescimento do X!9I
tem substitu/do o mod[pFthon pouco a pouco.
=sso se deve % facilidade e fle$ibilidade que o U9V= oferece e ao ganho de
performance que tambm oferece na maior parte dos casos.
'yt4onR D0ango e bibliotecas adicionais
&a maioria das distribuiAes $inux, o 'yt4on instalado como parte oficial do
sistema operacional. .as em outros casos preciso ser feita sua instala'o.
@ necessrio tambm instalar o D0ango. &'o necessrio que ele sea instalado
entre os pacotes oficiais do <Fthon, pois pode simplesmente ser colocado na
mesma pasta do proeto, mas ainda assim, ele necessrio.
@ preciso tambm instalar a biblioteca de acesso ao banco de dados. @ ela
quem faz a ponte entre o <Fthon e o seu banco de dados escolhido.
As bibliotecas de acesso a bancos de dados s'o estas4
.F9Y1db >para acesso a .F9Y1?
pF9Y1ite >para acesso a 9Y1ite?
c$[Oracle >para acesso a Oracle?
psFcopg >para acesso a <ostre9Y1?
psFcopgC >para acesso a <ostre9Y1?
<FUinIC >para acesso a .icrosoft 9Y1 9erver?
#r>ui(os estticos
Os arquivos estticos s'o arquivos de imagensR C!!R Ua(a!criptR 8las4
!4ocD?a(es e outros. &'o comum lanar um site sem alguns deles.
Yuando se faz o deploy de um proeto, preciso configurar o servidor Teb para
publicar seus arquivos estticos de forma independente do +ango. O +ango n'o
foi constru/do para servir arquivos estticos e n'o vale a pena perder performance
5;D
com isso.
Outra recomenda'o importante a separaB)o do servidor Teb do pro0eto do
servidor Teb de arquivos estticos. &'o necessria a separa'o entre mquinas
diferentes, o que recomendamos que as configuraAes dos servidores Teb seam
independentes uma da outra.
A cada vez que uma nova pessoa entra em seu site, uma mquina virtual <Fthon
instanciada para ela, e isso geralmente custa em torno de 5K.b a ID.b de
mem7ria. Arquivos estticos n'o precisam nem de um dcimo disso. 9e o seu
servidor Teb for configurado para abrir instEncias com pouca mem7ria, sua
mquina virtual <Fthon ser preudicada, e caso sea configurado para ocupar muita
mem7ria, os arquivos estticos ser'o os preudicados.
<ortanto, sempre que poss/vel, crie dois dom/nios separados, assim por
e$emplo4 para um site que possui o seguinte dom/nio4
tt"&''b$ogEdoEa$ataNan.com'
8enha um subdom/nio assim para arquivos estticos4
tt"&''media.b$ogEdoEa$ataNan.com'
+essa forma voc( pode configurar o servidor Teb de formas diferentes,
otimizando cada um de acordo com seu caso. 2oc( pode inclusive separar para
softTares servidores Teb diferentes se preferir. E$emplo4 #pac4e para o proeto
em +ango e $ig4ttpd para arquivos estticos.
'ro0eto do site
O proeto o cora'o de seu site. Gonstru/do em +ango, a !nica pea de fato
espec/fica para o nosso frameTor". =sso quer dizer que todo o restante do site pode
ser aproveitado da mesma forma para diferentes linguagens e diferentes
frame?orDs, mas esta espec/fica para o +ango4 seu pro0eto e a configuraB)o
do servidor Teb para disponibiliz,lo.
ar(ore de pastas ideal
*]rvore de pastas* a forma como as pastas de seu proeto est'o organizadas.
R infinitas formas de se fazer isso.
#ma boa forma para organizar a pastas de proetos em +ango esta4
5;5
Esta rvore de arquivos est adequada para o sistema de arquivos do 1inu$,
#ni$ e .acO9Q, que untos formam a maioria dos servidores Teb dispon/veis em
servios de hospedagem. Entretanto poss/vel construir uma rvore de pastas
id(ntica no UindoTs, e$ceto pelos lin"s simb7licos. .as isso poss/vel de
contornar para quem tem prtica com servidores nesse sistema operacional.
Observe que dentro da pasta "d0ango" h duas pastas4
pluggables
2oc( deve colocar nesta pasta as aplicaAes plugveis e$tras do proeto, que
veremos mais detalhadamente em um cap/tulo adiante.
#plicaBes plug(eis s'o recursos e$tras que n'o s'o fornecidos pelo +ango,
mas por terceiros. R centenas delas na Ueb, a grande maioria gratuita e livre.
<ortanto, esta deve ser a pasta onde essas aplicaAes plugveis ser'o instaladas.
Assim, elas podem ser usadas por vrios proetos em um !nico servidor.
pro0ects
&esta pasta ser'o instaladas as pastas de proetos. Ou sea, at mesmo se voc(
possuir mais de um site em seu servidor, dessa forma suas pastas continuam
5;C
organizadas.
Eas atenB)o: ao invs de colocar diretamente a pasta do proeto, crie uma pasta
para o site e dentro desta pasta, coloque a do proeto, pois um site mais do que o
proeto. @ muito provvel que voc( v querer documentar seu site, adicionar alguns
arquivos de hist7rico e definiAes, bac",ups e outros, portanto, o proeto n'o se
limita aos arquivos,fonte em +ango.
Agora, dentro da pasta do site do proeto, est a pasta do proeto em +ango >
meu&blog ?. +entro dela, alm do que vimos no decorrer dos cap/tulos
anteriores, h ali uma novidade4
deploy
Esta pasta o lugar ideal para se guardar4
os scripts de e$ecu'o do proeto >scripts 8astC9I e X!9I, por e$emplo?N
e outros scripts e arquivos relacionados ao deploy no servidor, como por
e$emplo um arquivo com a lista de cron 0obs, que s'o tarefas agendadas para
servidores $inux2+nix2EacK! H.
&o mesmo n/vel da pasta do proeto h outra pasta aqui4
dependencies
Esta pasta deve conter um arquivo chamado ,%#DE% onde voc( ir escrever
as depend(ncias de seu proeto.
E$emplos4 se seu proeto trabalha somente na vers'o 5.D.C do +ango, escreva
isso nesse arquivo. 9e seu proeto depende de alguma ferramenta e$terna como o
ffmpeg, mimms ou Image EagicD, escreva tambm. Gaso utilize funcionalidades
do campo Image8ield, voc( vai precisar da biblioteca 'I$, portanto, escreva isso.
9empre de forma e$pl/cita, informando a vers'o utilizada, o porqu( e como
dei$ar isso funcionando no proeto. =sso e$tremamente importante para que n'o
se perca no futuro.
'or>uQ usar o inglQs nas pastas do ser(idorJ
O ingl(s a linguagem universal da atualidade. Ainda mais na informtica.
#m dia qualquer, voc( e sua equipe podem precisar da auda de algum que n'o
conhece o seu idioma. Ent'o essa pessoa ir fazer buscas no servidor por palavras
comuns em l/ngua inglesa.
&um mundo cada dia mais globalizado, isso se torna cada dia mais importante.
5;I
% agoraR (amos ou n)o configurar um ser(idorJ
9im, vamos... calma Alatazan, o processo de deploy realmente abrangente,
mas voc( vai perceber que na prtica n'o t'o comple$o quanto parece, pois a
maioria dessas ferramentas pode ser instalada com grande facilidade ou muitas
vezes v(m instaladas nos servios de hospedagem, portanto, atente,se aos
conceitos, pois eles s'o importantes de se conhecer.
Hom... mas como resumir todo esse aprendizado te7rico de hoe3 , os olhos
de Alatazan estavam um pouco (ermel4os e ardiam, pois muito chato ficar
ouvindo outra pessoa falar e n'o ver exemplos na prtica.
O melhor resumo para hoe s'o os diagramas, observe,os novamente, e n'o
se limite a isso. 9ervidores s'o evolu/dos e austados ao longo do tempo, %
medida que o administrador e o site amadurecem. E para cada tipo de servidor
ou servio de hospedagem h tutoriais com e$plicaAes na Teb, a/ basta fazer
uma busca)
O", mas amanh' vamos configurar um servidor UindoTs com Apache e
.F9Y1 n3
9im, vamos fazer isso amanh'. Agora hora de relaxarR respirar fundo e
procurar alguma coisa light pra fazer.
5;L
Captulo 16: Preparando um servidor com Windows
Um ndio passou em seu cavalo a galopes entre duas
rochas. Havia poeira no ar, e tambm havia o cheiro da
poeira, o Sol castigava a poeira, e a terra vermelha
socada por sculos de pouca chuva e muito vento, fazia
desenhos atravs do deserto, com muita poeira.
Os desenhos serpenteavam por aqui e ali, e pelas
serpentes, ora passavam cavalos, ora passavam rios, ora
passava uma criana chorando no colo de sua me,
segurando firme seu i!od.
O ndio de pele vermelha " no se sabe se era devido ao Sol, devido # terra
avermelhada da regio ou devido # sua timidez naquele momento " galopou
novamente at uma lagoa, entregou pei$es # boca de um golfinho, montou seu
cavalo novamente e rumou a um celeiro, atravessando por uma %anela larga e alta,
e...
Opa& 'oltando os olhos novamente #quele menino que no para de chorar,
agora sentado com sua me, assistindo aos colegas terminarem a pea, morrendo de
inve%a porque no ia ganhar os aplausos do teatro e nem o novssimo (eleca)o*
verde, uma nova mania gosmenta da sesso de desenhos, e... enfim, isso nem
interessa...
+o final, Cadu correu at Cartola, tirou uma onda, curtiu seu momento de
ator"mirim e voltou a rodopiar por ali.
(as +latazan ainda estava um pouco ligado no assunto do servidor para o dia
seguinte...
Mas porqu construir um servidor no Windows?
+ maior parte dos servidores ,eb so Linux. !or alguns motivos, em grande
parte dos casos os sistemas de padro Uni$, como -inu$, Solaris e (acOS ., so
mais adequados para servidores quando se trata de /%ango.
(as o mundo multi, e vamos falar agora de como se fazer as coisas no
012
3indo,s. Os procedimentos so semelhantes nos dois sistemas operacionais, e a
parte mais importante " a configurao para ter seu pro%eto funcionando "
realmente muito parecida entre ambos, portanto seu aprendizado ser4 5til em
qualquer caso, mas agora vamos ao trabalho&
'oc6 pode usar a mesma m4quina que tem usado para estudar o /%ango, pois
no se tratam de recursos conflitantes.
7sta uma situao bastante normal para intranets e sistemas em redes locais.
Instalando o pac!e
+ primeira coisa a se fazer instalar o pac!e " de prefer6ncia na vers"o #$#.
!ara isso v4 ao site oficial e faa o do,nload do arquivo de instalao8
http://httpd.apache.org/download.cgi
-ocalize agora um bloco que inicia com %pac!e &''P (erver #$#$11 is t!e
)est availa)le version% ou algo bem semelhante a isso. 9esse bloco h4 uma lista
das op:es mais comuns de do,nload do +pache. 7scolha o instalador para
Windows* sem cripto+ra,ia, que em ingl6s est4 assim8
Win32 Binary without crypto (no mod_ssl) (MS nstaller):
Ou quase isso8

;lique no lin< para fazer o do,nload.
7nquanto o do,nload feito, sua mente deve estar se perguntando %porqu !-
01=
um ar de inde,ini."o aqui?%.
Soft,are um produto din/mico, e so,tware livre quase or+/nico e evolui
rapidamente. > prov4vel que ao final deste livro a verso mais recente do +pache
ser4 outra, e at mesmo do /%ango. Ou se%a, impossvel indicar um caminho
e$ato para isso ho%e, se voc6 vai us4"lo amanh. !ortanto fique ligado e observe
que os n5meros da vers"o podem mudar rapidamente.
+o final do do,nload, clique duas vezes sobre o arquivo bai$ado, que ser4
e$ecutado e a primeira %anela ser4 esta8

Siga clicando no boto %0ext% e ve%a a %anela seguinte8
(arque na primeira opo, indicando que aceita a licena do +pache, e siga
01?
clicando em %0ext% at chegar a esta outra %anela8
!reencha os respectivos valores para os campos. ;aso no saiba o que
preencher ali, preencha da seguinte forma8
9et,or< /omain8 %local!ost%
Server 9ame8 %local!ost%
+dministrator@s 7"mail +ddress8 %seu1email2qualquercoisa$com%
(odifique o campo %dministrator3s 45mail ddress% de acordo com seu
prAprio e"mail e siga adianta clicando em %0ext% at finalizar.
+o finalizar a instalao, verifique o cone do pac!e na )ande6a do
3indo,s, prA$imo ao relAgio8

+gora v4 ao navegador e carregue o seguinte endereo8
http://localhost/
Observe que desta vez no informamos a porta, pois estamos indicando que ela
deve ser a porta &''P padro8 a 78. 'e%a o resultado8
011

'iu como f4cil ter o +pache funcionando em sua m4quina 3indo,sB
Instalando o M9(:L
+gora vamos instalar o (*SC-, o banco de dados que vamos usar neste
servidor.
!ara isso, v4 ao site oficial de do,nload do (*SC-8
http://de!.mys"l.com/downloads/mys"l/#.$.html%win32
+ verso mais indicada a vers"o ;$1. 9a opo %Windows 4ssentials <x76=%,
clique no lin< %Pic> a mirror%.

01D
Ser4 requisitado um cadastro gratuito, apenas para fins de propaganda mesmo.
Eaa"o Fno h4 outra forma, sorryG e siga para selecionar um dos servidores
%mirrors% para do,nload.
+pAs o do,nload, clique duas vezes sobre o arquivo bai$ado e inicie a
instalao do (*SC- no 3indo,s.
Siga clicando no boto %0ext% at finalizar a instalao.
+o final ser4 e$ibida uma nova %anela para configurao do (*SC- Fque por
sinal muito semelhante #s %anelas de instalaoG.
0DH
!rossiga clicando sobre %0ext%, modificando as op:es padro somente se
estiver certo de tal mudana. +t chegar a essa tela8
7scolha a segunda opo F %?est (upport ,or Multilin+ualism% G. Isso vai
tornar a codificao de caracteres padro em %@'A57%, a que melhor se relaciona
com o /%ango, e evitar alguma eventual chatice alguns dias # frente.
!rossiga clicando em %0ext% at chegar a esta tela8
0D0
(arque a cai$a %Include ?in Birector9 to Windows P'&%.
!rossiga clicando em %0ext% at esta outra tela8
/etermine uma senha difcil de ser quebrada, mas caso tenha d5vidas,
simplesmente informe8
!ass,ord8 %1#CD;6%
;onfirm8 %1#CD;6%
!orqu6 eu sugiro uma senha to f4cil de ser quebradaB Simples8 para que voc
n"o o ,a.aE
!rossiga clicando em %0ext% at executar a configurao e conclu"la.
!ronto& +gora temos o (*SC- rodando em seu servidor 3indo,s&
0DJ
P9t!on e B6an+o
;aso esta m4quina no possua !*thon ou /%ango, faa a instalao seguindo os
mesmos passos do captulo K " ?aixando e Instalando o B6an+o " com a diferena
que desta vez no preciso instalar a biblioteca de acesso ao banco de dados
SC-ite Fp*SC-iteG, pois vamos usar o (*SC-.
?i)lioteca de acesso ao M9(:L
/esta vez, a biblioteca de acesso ao banco de dados ser4 a %M9(:L ,or
P9t!on%, a biblioteca respons4vel por isso no !*thon.
!ara fazer o do,nload, v4 # seguinte p4gina da ,eb8
http://source&orge.net/pro'ects/mys"l(python
Eaa o download do m9sql5p9t!on na opo %M9(:L5p9t!on51$#$#$winC#5
p9#$;$exe%. /a mesma forma que as instala:es anteriores, a vers"o atual pode
variar para cima F0.J.K, 0.K ou J.H por e$emploG8

+pAs o do,nload, clique duas vezes sobre o arquivo bai$ado para instalar o
M9(:L ,or P9t!on no 3indo,s e siga a instalao clicando em %van.ar% at
finalizar.
Instalando o mod1p9t!on
;omo %4 foi dito no captulo anterior, o mod1p9t!on ainda a forma mais
comum de instalar pro%etos em /%ango no +pache em servidores dedicados, mesmo
0DK
que a opo mais recomendada se%a o W(FI.
9este captulo, vamos trabalhar com o mod1p9t!on e em um prA$imo captulo
ser4 a vez do W(FI, isso porque importante voc6 conhecer os dois. (as no se
esquea que possvel ter qualquer um deles FmodLp*thon, 3SMI ou East;MIG
instalado em 3indo,s ou -inu$.
!ara fazer o do,nload do mod1p9t!on para 3indo,s, carregue a seguinte
p4gina em seu navegador8
http://httpd.apache.org/modules/python(download.cgi
-ocalize o bloco na p4gina que comea desta forma Flembrando que a verso
pode variarG8
)pache Mod_python 3.3.$ is now a!aila*le
7 abai$o dele, clique sobre o lin< %WinC# ?inaries%. Uma lista nada amig4vel
ser4 e$ibida. 'oc6 deve localizar dentre as op:es, o mod1p9t!on para a sua
verso do !*thon F #$; G e a sua verso do +pache F #$# G, que atualmente esta8
mod_python(3.3.$.win32(py2.#()pache2.2.e+e
+pAs o final do do,nload, clique duas vezes sobre o arquivo bai$ado e prossiga
clicando em %van.ar% at esta %anela ser e$ibida8
7scolha o camin!o de instala."o do +pache, que este8
c:,)r"ui!os de programas,)pache So&tware -oundation,)pache2.2
!rossiga para finalizar a instalao.
0DN
+gora abra o seguinte arquivo para edio, usando o ?loco de 0otas8
.:,)r"ui!os de programas,)pache So&tware
-oundation,)pache2.2,con&,httpd.con&
-ocalize uma linha que inicia com %LoadModule% e acrescente a seguinte
linha abai$o dela8
/oadModule python_module modules/mod_python.so
Salve o arquivo. Eeche o arquivo.
9a verdade voc6 vai encontrar muitas linhas assim, mas no se preocupe. Se
acrescentar a nova linha abai$o de qualquer uma delas, estar4 no lugar correto.
7 agora voc6 tem o mod1p9t!on instalado em seu servidor 3indo,s.
Con,i+urando seu pro6eto no servidor
)om, agora estamos caminhando para o final.
;rie na raiz da unidade %C:% do servidor a seguinte sequ6ncia de pastas8
.:,!ar,d'ango,pro'ects,site_meu_*log
O caminho acima apenas segue a nossa proposta do captulo 02, mas voc6 pode
trabalhar essa configurao como preferir.
7nvie Fusando seu meio escolhidoG a pasta do pro%eto F %meu1)lo+% G para
dentro da pasta criada acima.
+gora na pasta do pro%eto F
%C:GvarGd6an+oGpro6ectsGsite1meu1)lo+Gmeu1)lo+% G abra o arquivo
%local1settin+s$p9% para edio e o modifique para ficar assim8
% 0'ango settings &or meu_*log pro'ect.
import os
12345.6_2336_1)67 8 os.path.dirname(os.path.a*spath(__&ile__))
/3.)/ 8 -alse
05B9: 8 -alse
65M1/)65_05B9: 8 05B9:
0)6)B)S5_5;:;5 8 <mys"l<
0)6)B)S5_;)M5 8 <meu_*log<
0)6)B)S5_73S6 8 <localhost<
0)6)B)S5_9S52 8 <root<
0D2
0)6)B)S5_1)SSW320 8 <$23=#><
Isso vai fazer seu pro%eto trabalhar como se deve no servidor8 sem modo de
depura."o F /7)UM G e acessando ao banco de dados M9(:L. -embre"se de
informar a setting B'?(41P((WHIB com a senha correta que voc6
informou ao con,i+urar o (*SC-.
Criando o novo )anco de dados no M9(:L
(as agora precisamos criar um novo banco de dados no (*SC- para que seu
pro%eto trabalhe. ;omo est4 escrito na setting B'?(410M4, o banco de
dados dever4 ser chamado %meu1)lo+%.
9o menu %Iniciar% do 3indo,s, escolha a opo %4xecutar pro+rama% e
digite o seguinte comando8
mys"l (u root (p
Uma %anela do (S"/OS ser4 aberta para informar a senha do usu4rio %root%
no (*SC-. Informe a senha F a que voc6 escolheu para o lugar de %1#CD;6% G,
pressione 79O7P, e o s!ell do (*SC- ser4 aberto8

+gora digite a seguinte linha de comando8
create data*ase meu_*log?
7ste ser4 o resultado do comando8
mys"l@ create data*ase meu_*log?
Auery 3BC $ row a&&ected (D.D$ sec)
mys"l@
Eeito isso, seu banco de dados est4 criado.
0D=
Eeche a %anela do (S"/OS e v4 # pasta do pro%eto. ;lique duas vezes sobre o
arquivo %+erar1)anco1de1dados$)at% para gerar as tabelas para o novo banco de
dados em (*SC-. > agora que vamos saber se a nossa configurao est4 correta8

Informe os dados solicitados F Username, 7"mail, !ass,ord e !ass,ord again G
da mesma forma que fizemos no captulo N F Criando um )lo+ maneiro G, com
username %admin% e pass,ord %1%. +pAs finalizar a gerao do banco de dados,
feche a %anela e...
... pronto& (ais um passo dado& Oemos o pro%eto e o (*SC- conversando
naturalmente at aqui&
Con,i+urando o pac!e para seu pro6eto
+gora, para ter seu pro%eto funcionando no +pache, abra novamente o arquivo
%!ttpd$con,% da pasta %C:Grquivos de pro+ramasGpac!e (o,tware
AoundationGpac!e#$#Gcon,G% para edio e acrescente as linhas abai$o ao final
do arquivo8
E/ocation F/F@
Set7andler python(program
1ython1ath FG<c:/!ar/d'ango/pro'ects/site_meu_*log/meu_*log<H I sys.pathF
1ython7andler d'ango.core.handlers.modpython
Set5n! 04);:3_S566;:S_M309/5 settings
1ython0e*ug 3n
E//ocation@
0D?
O que fizemos aliB )om, ao abrir uma tag %Location%, indicamos que o
+pache deve seguir uma configurao especial para a sua UP- raiz.
E/ocation F/F@
+ linha seguinte determina que para esta UP- deve ser habilitado o suporte ao
!*thon.
Set7andler python(program
7sta linha abai$o indica a PJ'&H0P'& que o !*thon deve obedecer na
m4quina virtual que ser4 aberta para esta UP-. 9o caso, atribumos a pasta do
pro%eto F 3c:KvarKd6an+oKpro6ectsKsite1meu1)lo+Kmeu1)lo+3 G, acrescentada do
que %4 estava antes na !QOHO9!+OH F s9s$pat! G, seguindo a sinta$e do prAprio
!*thon para isso.
1ython1ath FG<c:/!ar/d'ango/pro'ects/site_meu_*log/meu_*log<H I sys.pathF
9a linha seguinte determinamos que o +pache deve utilizar o handler do
/%ango para atender #s requisi:es atravs do !*thon neste caso.
1ython7andler d'ango.core.handlers.modpython
7 aqui declaramos uma vari-vel de am)iente que determina o mAdulo que
contm as settin+s do pro%eto. Observe que se indicamos a pasta do pro%eto #
!QOHO9!+OH, ento todos os mAdulos F arquivos com e$tenso %$p9% G que
esto na pasta do pro%eto podem agora ser informados com seu 5nico nome, pois
eles esto na !QOHO9!+OH sem nenhum pacote intermedi4rio. 9a pr4tica,
estamos passando o arquivo %settin+s$p9% para o /%ango .
Set5n! 04);:3_S566;:S_M309/5 settings
!or fim, definimos o estado de depura."o para a m-quina virtual do !*thon.
;omo estamos ainda em processo de colocar o site no ar, prudente manter essa
configurao. Cuando o site estiver em pleno funcionamento, recomend4vel que
esta linha se%a removida.
1ython0e*ug 3n
Salve o arquivo.
Ieiniciando o pac!e
+gora, observe o cone do pac!e na )ande6a do 3indo,s, prA$imo ao
relAgio, clique sobre ele e escolha a opo %Iestart% para reiniciar o +pache e
aplicar a mudana feita.

0D1
'4 ao navegador e carregue o endereo do servidor8
http://localhost/
+ seguinte p4gina ser4 carregada8
Olha sA& Oemos o nosso site funcionando no servidor& (as onde foi parar tudo
aquilo que fizemos de ima+ens e estilos C((B
Simples. -embra"se que a UP- 3LmediaK3 sA reconhecida pelo /%ango em
ambiente de desenvolvimentoB !ois bem, agora temos que configurar o +pache
para reconhec6"la. Isto uma tarefa que no tem nenhum intermdio do /%ango. >
apenas um endereo do +pache que aponta para uma pasta no H/. 'amos l4B
'olte ao arquivo de configurao do +pache F %!ttpd$con,% G e acrescente o
seguinte trecho de cAdigo ao final dele8
)lias /media .:/!ar/d'ango/pro'ects/site_meu_*log/meu_*log/media
E0irectory F.:/!ar/d'ango/pro'ects/site_meu_*log/meu_*log/mediaF@
3rder allowCdeny
)llow &rom all
E/0irectory@
E/ocation F/mediaF@
Set7andler ;one
E//ocation@
0DD
Um cuidado especial aqui8 muito f4cil fugir da sinta$e neste arquivo de
configurao, portanto fique atento aos espaos ou # falta deles... um bom e$emplo
a parte Rallo,,den*R que no pode ter um espao antes ou depois da vrgula
O bloco acima faz com que o +pache entenda que ao carregar a UP- %Kmedia%
F e UP-s RfilhasR G, a pasta
%C:KvarKd6an+oKpro6ectsKsite1meu1)lo+Kmeu1)lo+Kmedia% deve ser tomada
como base, ou se%a, a pasta de arquivos est4ticos do nosso pro%eto.
+ linha que faz esse trabalho esta8
)lias /media .:/!ar/d'ango/pro'ects/site_meu_*log/meu_*log/media
(as isso no suficiente, pois preciso dar permisso # pasta indicada,
portanto, este bloco abai$o d4 a permisso necess4ria8
E0irectory F.:/!ar/d'ango/pro'ects/site_meu_*log/meu_*log/mediaF@
3rder allowCdeny
)llow &rom all
E/0irectory@
!or fim, este 5ltimo bloco desabilita o !*thon para a UP- Kmedia, para que ela
trabalhe somente com arquivos est4ticos, sem qualquer interfer6ncia do /%ango.
E/ocation F/mediaF@
Set7andler ;one
E//ocation@
Salve o arquivo. Ieinicie o +pache, usando o cone na )ande6a do 3indo,s
na opo %Iestart% para aplicar a mudana que fizemos.
'oltando ao navegador, pressione A; e ve%a como ficou8
JHH
SatisfeitoB (as como pode notar, no temos nenhum arti+o publicado, devido a
ser outro banco de dados. !ortanto, vamos ao dmin do site para criar os novos
artigos& 9o navegador, carregue a seguinte UP-8
http://localhost/admin/
'e%a como ele ser4 carregado8
JH0
7ta& (as nAs no havamos resolvido o problema dos arquivos est-ticosB
Sim, mas a UP- que resolvemos foi a %Kmedia% " a UP- de arquivos est4ticos
do pro%eto. !orm, agora se trata do dmin, que um caso especial, e possui seu
prAprio caminho para arquivos est4ticos, com prefi$o %Kadmin1media%, informado
na setting %BMI01M4BI1PI4AIM%.
!ortanto, volte ao arquivo de configurao do +pache F %!ttpd$con,% G e
acrescente mais estas linhas ao final8
)lias /admin_media .:/python2#/li*/site(pacJages/d'ango/contri*/admin/media
E0irectory F.:/python2#/li*/site(pacJages/d'ango/contri*/admin/mediaF@
3rder allowCdeny
)llow &rom all
E/0irectory@
E/ocation F/admin_mediaF@
Set7andler ;one
E//ocation@
O que fizemos a foi e$atamente o mesmo que fizemos para a UP- Kmedia, mas
desta vez trabalhamos a UP- Kadmin1media, que direcionada para a pasta de
arquivos est4ticos da contrib dmin.
Salve o arquivo. Eeche o arquivo. Ieinicie o +pache.
+gora atualize o navegador e ve%a como ficou8
JHJ
!ronto& Servidor funcionando, podemos partir para o prA$imo desafio&
4 a* o qu mais?
O qu6 maisB (eu amigo, estamos no meio da histAria, e nem terminamos o
assunto do deploy& +manh vem a 5ltima bolacha do pacote.
;artola encabulou com a energia de +latazan. 7le no parecia e$austo depois da
e$tensa aula de ho%e. !elo contr4rio, +latazan queria mais, queria saber quais outras
formas de deploy e$istem, porque essa foi barbada.
9ena, que queria ir embora, pu$ou a cadeira que estava ao lado, coou a
bochecha, deu uma olhada no relAgio e tomou sua vez8
+latazan, amanh vai ser a minha vez de passar com voc6... quero te mostrar
um servidor no Linux e outras coisas diferentes, vamos mudar isso aqui um
pouco que esse ambiente de %anelinhas de no a minha praia no... " 9isso ela
olhou irSnica para o ;artola, que brigava com seu (ac pra pegar alguns
arquivos do i!od. + resposta veio de bate"pronto.
He*, quem gosta de %anelinha aqui o +latazan, no sou eu no hein, gosto
de coisa com mais estilo.
+latazan me$eu sua peruca desalinhado, fez de conta que no ouviu e tratou de
voltar ao assunto8
)om, ento ho%e instalamos um monte de coisas8
+pache J.J
(*SC- 2.0
(*SC- for !*thon 0.J.J
modLp*thon K.K.0
Olha, no se prenda #s versNes secund4rias, apenas atenha"se a pegar a
verso est4vel mais recente. Meralmente funciona melhor.
7 sA completando, meu camarada... quando ela fala em verso Rsecund4riaR,
isso quer dizer que se aparecer um +pache K.H ou (*SC- =.H, bom fazer uns
testes antes, pois as vers:es prim4rias geralmente mudam muitas coisas...
O< o<... valeu, %4 peguei. !or fim..
;onfiguramos o acesso ao banco de dados no arquivo %local1settin+s$p9%
do servidorT
;riamos o banco de dados no (*SC-T
JHK
Meramos as tabelas do banco de dados pelo /%ango...
9ena tomou a palavra, %4 que ela tinha pressa e o +latazan estava falando
lentamente, como se estivesse saboreando um daqueles churrascos de la+artos de
Oatara...
e configuramos o +pache, criando a Location para o pro%eto e os lias pra
UP-s de arquivos est4ticos& + foi sA reiniciar o +pache e a m4gica est4 feita&
'amos embora pessoalB
)acana, amanh ser4 a vez do -inu$& 'ai l4 meu camarada, vou sA pegar
essa m5sica aqui e %4 vou descendo...
/ito isso, ;artola voltou sua ateno para o computador e os dois saram, se
despedindo do CadP e da priminha que insistia em arrancar seu nariz.
JHN
Captulo 1Q: Preparando um servidor com Linux
9aquela noite ao chegar # sua casa, 9ena abriu uma
nova m-quina virtual com o @)untu Linux em seu
laptop. 9o queria usar sua instalao oficial cheia de
coisas %4 instaladas.
+latazan por sua vez aproveitou a passagem de uma
nave-gal de Uatara pelo nosso sistema solar para dar
uma passadinha por l4 Fatr4s de V5piterG e buscar
algumas coisas que sua me mandou.
+ definio mais comum da palavra RmeR em nossa gal4$ia de %aquela que
serve* prote+e* re+ula e manda pra voc um monte de coisas inPteis que um
dia com ,e)re e assaduras voc desco)re que n"o eram t"o inPteis assim%.
;laro que a me de +latazan no foge # definio, e nas cai$as que mandou
esto alguns pacotinhos com... por e$emplo8 uma cai$inha de cuecas refrescantes,
um spra* do pA que refresca as cuecas por algum tempo, uma chave"polvo para
desentalar o spra* de vez em quando e uma alga"area para alimentar a chave"
polvo.
+o sair de Uatara, +latazan se sentiu aliviado por no ser mais obrigado a usar
as tais cuecas a guardou as poucas que trou$e em algum lugar no fundo da nave.
(as agora, cansado de desenhar silhuetas desconfort4veis para o ventilador, ele
estava com uma assadura na virilha, o que fazia com que andasse desa%eitado,
parecendo um 4$'$ e no sabia mais onde as cuecas estavam. !or isso, os pacotes
de sua me foram bastante tranquilizadores.
@m servidor 188R livre
9o captulo anterior, trabalhamos com um con%unto bastante comum, com as
ferramentas mais populares dentre as que estamos trabalhando8 Windows S
M9(:L S pac!e S mod1p9t!on.
(as agora o nosso foco trabalhar com alternativas.
9o que 3indo,s trabalhe melhor com (*SC- ou -inu$ trabalhe melhor com
JH2
!ostgreSC-, no bem por a... o bom conhecer sistemas operacionais diferentes,
bancos de dados diferentes, servidores ,eb diferentes e assim por diante.
!ara colocar em pr4tica o nosso servidor em -inu$, no se esquea de que
preciso ter o controle total do sistema, do contr4rio no ser4 possvel instalar os
soft,ares que vamos instalar nem mesmo configur4"los. !ortanto, a recomendao
que agora voc6 use sua instalao do Ubuntu em m-quina local ou em uma
m-quina virtual, como +latazan o fez.
9este captulo vamos trabalhar no universo @)untuKBe)ian, que esto entre as
distribui:es mais populares do -inu$.
!ara fazer o do,nload do Ubuntu, v4 at esta p4gina8
http://www.u*untu.com/
7 para instal4"lo em uma m4quina virtual, faa sua escolha favorita. Uma boa
opo o Tirtual?ox8
http://www.!irtual*o+.org/
+mbos so livres e +ratuitos, ali4s uma coisa bem comum entre todas as
ferramentas que vamos tratar aqui.
O Ubuntu -inu$ possui uma interface gr4fica e$tremamente f4cil e amig4vel,
entretanto, como muitos servidores -inu$ no possuem ambiente gr4fico, vamos
trabalhar constantemente em Console " modo te$to semelhante ao Prompt do M(5
BH(.
9este captulo, assumimos que voc6 possui conhecimentos b4sicos em -inu$
suficientes para abrir o ;onsole como pode ver abai$o e ter um editor de sua
prefer6ncia, como g'im, vim, gedit, emacs, nano ou outro qualquer.
JH=
Instalando o Li+!ttpd
O -ighttpd um dos servidores ,eb mais leves e r4pidos que e$istem, pois tem
uma estrutura mais simples que o +pache e outros.
!ara instalar o -ighttpd, abra uma %anela do Console e digite o seguinte
comando8
sudo apt(get install lighttpd
O comando %sudo% solicita sua prApria senha para efeitos de segurana, mas
ele armazena essa senha em memAria por algum tempo, portanto voc6 precisa
digitar sua senha novamente somente se ficar muito tempo em espera.
;onfirme a instalao dos pacotes e espere pela concluso da instalao.
+o concluir, v4 at seu navegador, e assumindo que este%a trabalhando em
m4quina local, carregue a seguinte UP-8
http://localhost/
;aso este%a trabalhando em uma m4quina remota, digite a UP- para o caso.
/e qualquer forma, ve%a como aparece8

Sim, sA isso mesmo para instalar o Li+!ttpd.
Instalando o Post+re(:L
'amos agora instalar o !ostgreSC-, um dos bancos de dados livres mais
robustos e populares.
JH?
9o Console, digite a seguinte linha de comando8
sudo apt(get install postgres"l(K.3
;onfirme a instalao dos pacotes e aguarde pela concluso. +ssim como
aconteceu com o -ighttpd, ao concluir a instalao, o !ostgreSC- %4 iniciado.
+gora, precisamos definir uma senha para o usu4rio %post+res% para ter acesso
ao banco de dados. !ortanto, digite agora as seguintes linhas de comando8
sudo su postgres
ps"l
Ser4 aberto um novo shell da seguinte forma8
7ste o shell cliente do !ostreSC-, onde possvel realizar qualquer operao
SC- de de,ini."o de modelo de dados* consulta a dados* persistncia e tare,as
de manuten."o, enfim, muito poderoso.
!ara alterar a senha do usu4rio %post+res% do !ostgreSC-, digite a seguinte
linha de comando8
alter user postgres with password <$23=#><?
9o se esquea de trocar a senha 31#CD;63 pela de sua prefer6ncia. O resultado
na linha abai$o ser4 este8
)/652 23/5
!ronto. +gora digite o comando abai$o para sair do shell8
,"
7 para sair da sesso do usu4rio %post+res% digite8
e+it
JH1
Observe que estamos trabalhando aqui com dois usu4rios %post+res%
diferentes8 ora trabalhamos no usu4rio RpostgresR do Linux, ora com o usu4rio de
mesmo nome no Post+re(:L. Um possui vnculo indireto ao outro, mas se tratam
de coisas diferentes. +o modificar a senha do usu4rio no Post+re(:L, a senha do
usu4rio no Linux permanece como estava. (as isso irrelevante agora, pois esse
usu4rio sA ser4 usado para acesso a bancos de dados.
+gora, de volta # sesso do seu usu4rio, digite a seguinte linha comando8
ps"l (9 postgres (W
+o solicitar a senha, digite a senha informada no lugar de 31#CD;63 criada agora
h4 pouco. 'e%a a mensagem de erro que ser4 e$ibida8
ps"l: -)6)/: autenticaLMo do tipo dent &alhou para o usuNrio
FpostgresF
'e%a bem8 quando acessamos o psql usando uma sesso do usu4rio %post+res%
do -inu$, a autenticao foi aceita sem nem mesmo requisitar senha, mas agora
que usamos uma sesso do seu usu4rio, mesmo informando a senha correta a
autenticao foi re%eitada. !orqu6B
!orque e$iste uma configurao que determina isso. 'amos mudar essa
configurao. /igite o seguinte comando8
sudo nano /etc/postgres"l/K.3/main/pg_h*a.con&
'oc6 pode usar outro editor ao invs do nano, como o vim ou +edit por
e$emplo.
-ocalize agora as seguintes linhas, %4 prA$imo ao fim do arquivo8
% 0ata*ase administrati!e login *y 9;O socJets
local all postgres ident
sameuser
O que esta linha faz e determinar que o usu4rio %post+res% do !ostgreSC- sA
pode ser autenticado caso este%a acessando do servidor local, com o usu4rio
equivalente do sistema operacional Fou se%a, o usu4rio %post+res% do -inu$G.
'amos portanto liberar a autenticao deste usu4rio por outros Fcomo o seu prAprio
usu4rio por e$emploG. !ara isso, modifique as linhas para ficar assim8
% 0ata*ase administrati!e login *y 9;O socJets
local all postgres password
Salve o arquivo. Eeche o arquivo.
+gora de volta ao s!ell, reinicie o servio do !ostgreSC- com a seguinte linha
de comando8
sudo /etc/init.d/postgres"l(K.3 restart
JHD
+gora ao tentar novamente o seguinte comando, voc6 ter4 sucesso8
ps"l (9 postgres (W
'e%a o resultado8

!ronto& +gora temos o !ostgreSC- funcionando em nosso servidor, da forma
apropriada ao que precisamos.
P9t!on e B6an+o
O @)untu Linux tem o P9t!on como linguagem principal, portanto, voc6 no
precisa se preocupar em instal4"lo, pois ele %4 vem instalado. O mesmo vale para o
Be)ian.
!ara instalar o B6an+o no Ubuntu -inu$ " Intrepid I)ex, verso 7$18 " basta
digitar a seguinte linha de comando8
sudo apt(get install python(d'ango
+pAs confirmar e concluir a instalao, seu servidor %4 ter4 o /%ango na verso
0.H " no mnimo " devidamente instalada.
V4 nas demais vers:es do Ubuntu -inu$, isso no recomend4vel, pois a
maioria delas ainda tem esse pacote em uma verso antiga do /%ango F 8$U6 G.
!ortanto neste caso, para instalar o /%ango, faa assim8
!rimeiro instale o (u)version, com a seguinte linha de comando8
sudo apt(get install su*!ersion
/epois de confirmar e concluir a instalao do (u)version, faa o do,nload do
/%ango 0.H.J8
svn co
J0H
http://code.djangoproject.com/svn/django/tags/releases/1.0.2/
django-1.0.2
Isso vai bai$ar o cVdi+o5,onte da 5ltima reviso da verso 0.H.J do /%ango,
usando o (u)version " um soft,are de controle de vers:es.
+pAs concluir o do,nload, entre na nova pasta %d6an+o51$8$#% e instale o
/%ango8
cd d'ango($.D.2
sudo python setup.py install
+pAs concluir a instalao do /%ango, para confirmar que est4 tudo o<, digite as
seguintes linhas de comando para voltar # sua pasta &HM4 e acessar o s!ell
interativo do !*thon8ip
cd P
python
7 agora, fora da pasta de instalao do /%ango e dentro do s!ell interativo,
digite estas linhas de comando8
import d'ango
d'ango.get_!ersion()
O resultado dever4 ser este Fou outro muito semelhante a este, mas sem
mensa+em de erroG8
<$.D.2 &inal<
+gora saia do s!ell interativo, pressionando ControlSB.
!ronto& +gora temos o B6an+o numa verso bacana funcionando em nosso
servidor&
?i)lioteca de acesso ao Post+re(:L
+ biblioteca de acesso ao !ostgreSC- para o !*thon se chama %ps9cop+#%.
!ara instalar o %ps9cop+#% no Ubuntu, basta digitar a seguinte linha de comando
no s!ell do -inu$8
sudo apt(get install python(psycopg2
!ronto& +pAs confirmar e concluir a instalao, %4 temos a biblioteca de acesso
ao !ostgreSC- funcionando no !*thon em nosso servidor&
Instalando o ,lup para tra)al!ar com AastCFI no P9t!on
+gora, como e$ploramos o mod1p9t!on no captulo anterior, desta vez vamos
trabalhar com o AastCFI no -ighttpd. 7nto, ser4 necess4rio instalar o ,lup, a
J00
biblioteca do !*thon respons4vel pela compatibilidade com o AastCFI.
!ara isso, digite a seguinte linha de comando8
sudo apt(get install python(&lup
+gora o seu !*thon est4 preparado para trabalhar com East;MI.
Con,i+urando seu pro6eto no servidor
/a mesma forma que no 3indo,s, algumas coisas precisam ser feitas no
pro%eto para que ele trabalhe adequadamente no servidor. +lgumas dessas coisas
so semelhantes, outras no...
!ara comear, crie a nossa pasta de coisas em /%ango no servidor, assim8
sudo mJdir /!ar/d'ango
sudo chown S59_9S9)23 /!ar/d'ango
sudo chgrp S59_9S9)23 /!ar/d'ango
cd /!ar/d'ango
-embre"se de trocar o %(4@1@(@IIH% nas duas linhas de comando pelo
nome do seu usu4rio atual.
+s linhas de comando vo8
0. ;riar a pasta onde vamos colocar nossas coisas em /%ango, usando o
superusu4rio do sistema operacionalT
J. +ssumir o seu prAprio usu4rio como dono da nova pastaT
K. +ssumir o seu prAprio grupo como dono delaT
N. +cessar a pasta.
+gora cria a sequ6ncia de pastas8
mJdir pro'ects
cd pro'ects
mJdir site_meu_*log
Eeito isso, envie a pasta do seu pro%eto F %meu1)lo+% G para esta pasta do
servidor, em caminho completo8
/!ar/d'ango/pro'ects/site_meu_*log
!ara isso, utilize uma das formas de envio de arquivos abordadas no %captulo
1;: In,initas ,ormas de se ,aWer deplo9% Fsoft,are de controle de vers:es, EO! ou
EabricG.
+gora dentro da pasta do pro%eto no servidor F
J0J
%KvarKd6an+oKpro6ectsKsite1meu1)lo+Kmeu1)lo+K% G, abra o arquivo
%local1settin+s$p9% para edio8
cd meu_*log
nano local_settings.py
(odifique o arquivo, para ficar desta maneira8
% 0'ango settings &or meu_*log pro'ect.
import os
12345.6_2336_1)67 8 os.path.dirname(os.path.a*spath(__&ile__))
/3.)/ 8 -alse
05B9: 8 -alse
65M1/)65_05B9: 8 05B9:
0)6)B)S5_5;:;5 8 <postgres"l_psycopg2<
0)6)B)S5_;)M5 8 <meu_*log<
0)6)B)S5_73S6 8 <localhost<
0)6)B)S5_9S52 8 <postgres<
0)6)B)S5_1)SSW320 8 <$23=#><
-32.5_S.216_;)M5 8 <<
/a mesma forma que no captulo anterior, desa)ilitamos o modo de
depura."o, mas desta vez preparamos o pro%eto para trabalhar com o Post+re(:L,
ao invs do (*SC-. 9o v4 se esquecer de a%ustar a setting
%B'?(41P((WHIB% com a senha que escolheu para o lugar de
%1#CD;6%.
O principal ponto a ser observado nessa modificao trata"se desta linha8
-32.5_S.216_;)M5 8 <<
7la ter4 o papel de ocultar o nome interno do script do East;MI, e caso no
se%a informada, o site muito provavelmente se comportar4 de forma inst4vel em
suas UP-s.
Salve o arquivo. Eeche o arquivo.
Criando o novo )anco de dados no Post+re(:L
7 como definimos que o nome do banco de dados do pro%eto deve ser
J0K
%meu1)lo+%, ento devemos cri4"lo, certoB !ois o que vamos fazer agora.
9o s!ell, digite a seguinte linha de comando para acessar novamente o shell do
!ostgreSC-8
ps"l (9 postgres (W
Informe a senha correta e digite a seguinte e$presso SC-8
create data*ase meu_*log encoding <96-(K<?
7ssa linha de comando vai criar um novo )anco de dados e garantir que sua
codificao de caracteres a 3@'A573, a mais compatvel com o /%ango, por ele ser
@nicode.
O resultado desse comando deve ser simplesmente8
.25)65 0)6)B)S5
!ronto. )anco de dados criado& /igite esta outra linha de comando para sair do
shell do !ostgreSC-8
,"
+gora, precisamos gerar as tabelas do banco de dados, lembra"seB
SA para nos certificar, digite a linha de comando abai$o para se posicionar na
pasta do pro%eto8
cd /!ar/d'ango/pro'ects/site_meu_*log/meu_*log
+gora, digite esta outra linha de comando8
python manage.py syncd*
/epois de dadas as informa:es solicitadas FUsername, 7"mail, !ass,ord e
!ass,ord againG, o resultado deve ser este8
J0N

9o se preocupe em comparar tudo. Se no houve mensagem de erro porque
deu certo.
)acana& 7stamos caminhando bem& 9osso banco de dados foi criado e agora %4
possui as tabelas e outras entidades devidamente geradas pelo /%ango&
Con,i+urando o Li+!ttpd para seu pro6eto
+gora precisamos trabalhar a configurao do -ighttpd para reconhecer o seu
pro%eto, certoB 7nto vamos l4&
/igite as seguintes linhas de comando8
cd /etc/lighttpd/con&(a!aila*le
ls
'e%a o resultado8
D#(auth.con& $D(pro+y.con& $D(ssi.con& $D(
userdir.con&
$D(cgi.con& $D(rrdtool.con& $D(ssl.con& 25)0M5
$D(&astcgi.con& $D(simple(!host.con& $D(status.con&
7sses arquivos so pr"configurados para determinadas utilidades. > uma
dessas coisas feitas para a%udar quem est4 configurando o servidor. (as nAs vamos
criar um novo, completamente vazio. +bra um novo arquivo %185meu1)lo+$con,%
J02
para edio, assim8
sudo nano $D(meu_*log.con&
7screva estas linhas de cAdigo8
ser!er.modules I8 ( Fmod_&astcgiF )
ser!er.modules I8 ( Fmod_rewriteF )
&astcgi.ser!er 8 (
F/de&ault.&cgiF 8@ (
FmainF 8@ (
FsocJetF 8@ F/tmp/lighttpd(de&ault.socJFC
FchecJ(localF 8@ Fdisa*leFC
F*in(pathF 8@
F/!ar/d'ango/pro'ects/site_meu_*log/meu_*log/deploy/de&ault.&cgiFC
)
)
)
url.rewrite(once 8 (
FQ(/.R)SF 8@ F/de&ault.&cgiS$F
)
Pesumindo, o que fizemos foi8
;arregar os modulos de East;MI e Pe,riting do -ighttpd8
ser!er.modules I8 ( Fmod_&astcgiF )
ser!er.modules I8 ( Fmod_rewriteF )
/eterminar um caminho interno do servidor apontando para um script do
pro%eto Falem de determinar o caminho para o arquivo de soc<etG8
&astcgi.ser!er 8 (
F/de&ault.&cgiF 8@ (
FmainF 8@ (
FsocJetF 8@ F/tmp/lighttpd(de&ault.socJFC
FchecJ(localF 8@ Fdisa*leFC
F*in(pathF 8@
F/!ar/d'ango/pro'ects/site_meu_*log/meu_*log/deploy/de&ault.&cgiF
C
J0=
)
)
)
7 por ultimo, definimos uma UP- Fem e$presso regular que quer dizer8
%todas a partir da )arra%G para apontar para esse script8
url.rewrite(once 8 (
FQ(/.R)SF 8@ F/de&ault.&cgiS$F
)
Salve o arquivo. Eeche o arquivo.
+gora precisamos ativar essa configurao. !ara isso, vamos criar um lin>
sim)Vlico para representar o arquivo %185meu1)lo+$con,% na pasta que define as
configura:es ativadas.
sudo ln (s /etc/lighttpd/con&(a!aila*le/$D(meu_*log.con& ../con&(
ena*led/
Eeito.
+contece, que o script indicado no e$iste8
/!ar/d'ango/pro'ects/site_meu_*log/meu_*log/deploy/de&ault.&cgi
!ortanto, devemos cri4"lo8
cd /!ar/d'ango/pro'ects/site_meu_*log/meu_*log/
mJdir deploy
cd deploy
nano de&ault.&cgi
-embre"se de trocar o %nano% pelo seu editor preferido, caso ele no for o
nano.
+gora dentro do novo arquivo, digite as seguintes linhas de cAdigo8
%T/usr/*in/python
import sysC os
sys.path.insert(
DC </!ar/d'ango/pro'ects/site_meu_*log/meu_*log/<
)
sys.path.insert(
DC </!ar/d'ango/pro'ects/site_meu_*log/dependencies/<
)
J0?
sys.path.insert(
DC </!ar/d'ango/plugga*les/<
)
os.chdir(</!ar/d'ango/pro'ects/site_meu_*log/meu_*log/<)
os.en!ironG<04);:3_S566;:S_M309/5<H 8 <settings<
&rom d'ango.core.ser!ers.&astcgi import run&astcgi
run&astcgi(method8<threaded<C daemoniUe8<&alse<)
Pesumindo, o que fizemos nesse outro arquivo de script foi isso8
!ossibilitamos que este arquivo se%a e$ecut4vel, e dizemos ao -inu$ que ele
deve ser interpretado pelo !*thon8
%T/usr/*in/python
Importamos os pacotes de sistema do !*thon e do sistema operacional8
import sysC os
+crescentamos as pastas do pro%eto # !QOHO9!+OH8
sys.path.insert(
DC </!ar/d'ango/pro'ects/site_meu_*log/meu_*log/<
)
sys.path.insert(
DC </!ar/d'ango/pro'ects/site_meu_*log/dependencies/<
)
sys.path.insert(
DC </!ar/d'ango/plugga*les/<
)
+gora um pequeno trick necess4rio e a definio da vari4vel de ambiente
%BX0FH1(4''I0F(1MHB@L4% apontando o mAdulo que contm as
settin+s do pro%eto, que por sua vez ser4 localizada na !QOHO9!+OH que
acabamos de definir8
os.chdir(</!ar/d'ango/pro'ects/site_meu_*log/meu_*log/<)
os.en!ironG<04);:3_S566;:S_M309/5<H 8 <settings<
!or fim, e$ecuta a funo para %escutar% o AastCFI8
&rom d'ango.core.ser!ers.&astcgi import run&astcgi
run&astcgi(method8<threaded<C daemoniUe8<&alse<)
J01
7ntendidoB Salve o arquivo. Eeche o arquivo.
+gora vamos transformar esse arquivo que criamos em e$ecut4vel8
chmod aI+ de&ault.&cgi
Eeito isso, vamos reiniciar o -ighttpd para ver o efeito do que fizemos8
sudo /etc/init.d/lighttpd restart
O resultado das linhas de comando deve ser este8
R Stopping we* ser!er lighttpd G 3B H
R Starting we* ser!er lighttpd G 3B H
+gora va ao navegador e carregue o endereo de seu site8
http://localhost/
'e%a como ficou8
Wtimo& (as como deve ter percebido, nosso site est4 tosco. Sem imagens, sem
;SS. /a mesma forma como aconteceu no servidor 3indo,s, isso porque
precisamos agora definir as UP-s para arquivos est4ticos %Kmedia% e
%Kadmin1media%.
!ara fazer isso, edite novamente o arquivo de configura:es do -ighttpd.
+ssim8
sudo nano /etc/lighttpd/con&(ena*led/$D(meu_*log.con&
7 agora com o arquivo aberto para edio Fusando seu editor prediletoG,
modifique o arquivo para ficar assim8
J0D
ser!er.modules I8 ( Fmod_&astcgiF )
ser!er.modules I8 ( Fmod_rewriteF )
&astcgi.ser!er 8 (
F/de&ault.&cgiF 8@ (
FmainF 8@ (
FsocJetF 8@ F/tmp/lighttpd(de&ault.socJFC
FchecJ(localF 8@ Fdisa*leFC
F*in(pathF 8@
F/!ar/d'ango/pro'ects/site_meu_*log/*log/deploy/de&ault.&cgiFC
)
)
)
alias.url 8 (
F/mediaF 8@
F/!ar/d'ango/pro'ects/site_meu_*log/meu_*log/mediaFC
F/admin_mediaF 8@
F/usr/li*/python2.#/site(pacJages/d'ango/contri*/admin/media/F
)
url.rewrite(once 8 (
FQ(/media/.R)SF 8@ FS$FC
FQ(/admin_media/.R)SF 8@ FS$FC
FQ(/.R)SF 8@ F/de&ault.&cgiS$F
)
Observe que fizemos as seguintes modifica:es8
!rimeiro, acrescentamos dois %apelidos%, dizendo ao -ighttpd que tais UP-S
F%Kmedia% e %Kadmin1media%G devem apontar para as respectivas pastas no H/.
Ou se%a8 so UP-s simples para pastas de arquivos est4ticos e devem fazer
e$atamente isso8 retornar arquivos est4ticos do H/ no caminho definido.
Observe com ateno a pasta %KusrKli)Kp9t!on#$;Ksite5
pac>a+esKd6an+oKcontri)KadminKmediaK% pois ela pode ser diferente em seu
sistema operacional se por acaso ele usar a verso #*D do !*thon como padro.
alias.url 8 (
JJH
F/mediaF 8@
F/!ar/d'ango/pro'ects/site_meu_*log/meu_*log/mediaFC
F/admin_mediaF 8@
F/usr/li*/python2.#/site(pacJages/d'ango/contri*/admin/media/F
)
+s demais linhas que acrescentamos criam UP-s com suas respectivas
e$press:es regulares para os RapelidosR de arquivos est4ticos, ve%a8
FQ(/media/.R)SF 8@ FS$FC
FQ(/admin_media/.R)SF 8@ FS$FC
Salve o arquivo. Eeche o arquivo.
Peinicie o -ighttpd novamente8
sudo /etc/init.d/lighttpd restart
'olte ao navegador e... bingo&
(isso cumprida&
Tamos para a prVxima etapa?
/efinitivamente& Isso me lembra um velho ditado em Uatara8 ,aWeu* t-
JJ0
,aWido&
;artola trocou olhares com 9ena, deu uma risadinha contida com o canto da
boca... mas no quis corrigir o aliengena e quebrar sua empolgao. (as foi 9ena
que continuou a conversa8
Sim, +latazan... ve%a8
'oc6 instalou o -ighttpdT
e instalou tambm o !ostgreSC- e de,iniu uma sen!a de acesso ao banco
de dadosT
depois voc6 instalou o /%ango... em nosso caso usando o apt5+et tambmT
instalou o ps9cop+# para !ostgreSC- no !*thonT
instalou o ,lup para East;MI no !*thonT
enviou os arquivos do pro%eto para a pasta correta no servidorT
configurou o %local1settin+s$p9% para tirar o modo de depurao e
configurar o acesso ao )anco de dadosT
+latazan deu uma pescada e um arranque com a cabea, se refez e abriu bem os
olhos. 9ena continuava8
... criou o banco de dadosT
+erou as ta)elas no banco de dadosT
configurou o -ighttpd para acesso ao pro%etoT
criou um script de AastCFI no seu pro%etoT
e configurou as UP-s para arquivos est-ticos&
/epois dessa lista, emendou mais8
Olha, voc6 notou uma coisa interessanteB !ara quase tudo, usamos o apt5+et
para instalar as coisas. 7le faz isso8 bai$a o que precisamos, todas as suas
depend6ncias, configura tudo, move os arquivos nas pastas certas, faz tudo
direitinho...
7stava claro que ho%e 9ena estava com mais tempo. ;om bem mais tempo.
;om muito tempo.
+hh, %4 sei& 'amos ver W(FI e servidores compartil!adosB
7 muito empolgadinha tambm.
7rr... vamos fazer isso amanh... tenho minha aula de $adrez...
JJJ
Oudo bem rapaziada... mas enquanto vamos saindo, vou pedir uma coisa
importante pra voc6 fazer8 volte ao assunto do servidor no 3indo,s e compare
com o servidor no -inu$. 'ai perceber que e$istem mais semelhanas do que
parece&
JJK
Captulo 17: W(FI e (ervidores compartil!ados
Houve uma poca em que restavam poucos planetas e satlites prA$imos a
Uatara para serem habitados, e as pessoas perderam seu interesse por alguns deles
em especial, talvez devido # falta de atmosfera, pro$imidade de Uatara, falta de
4gua ou qualquer outra desculpa que viesse # cabea.
Isso no foi bom para os negAcios de algumas empresas.
Eoi por isso que a ?an+la Hportunidades Interplanet-rias lanou o slogan
%sV para escol!idos a dedo%. + parte do dedo no foi muito bem compreendida a
princpio, mas ser um escolhido parecia ser bastante recompensador.
+s sess:es para escolha de novos clientes eram caracterizadas, dentre outras
coisas, por avaliar eventos aleatoriamente e escolher aqueles que se esqueciam de
parar de bater palmas ao final dos aplausos. Ou mesmo aqueles que batiam palmas
sozinhos.
+tualmente a comunidade dos moradores do satlite Oatara54 o resultado
disso, e formada por uma populao e$tremamente altrusta. Seus moradores
compartilham suas casas, compartilham suas roupas, compartilham seus copos,
suas mulheres, seus maridos, suas crianas e suas cuecas, especialmente as su%as.
Xs vezes ocorrem algumas distra:es como consequ6ncia disso, mas no
interessa qual se%a o desfecho, no final tudo comemorado com uma boa cerve%ada
e um enterro festivo.
W(FI e servidores compartil!ados
Sim, esta a 5ltima bolacha do pacote do assunto de deploy.
O W(FI um recurso recente do !*thon, criado para superar os demais. 7le
simples, muitos o chamam de "cola", uma coisa que vai ficar entre outras duas,
somente para dar liga entre elas, e trabalha bem tanto de forma dedicada quanto
compartilhada. 7m Uatara chamariam isso de Rrecheio de sanduche de rodovi4riaR.
'amos agora voltar ao servidor 3indo,s e tratar de substituir o mod1p9t!on
pelo 3SMI.
JJN
?aixando e instalando o mod1ws+i para Windows
O mod1ws+i o mAdulo de suporte a W(FI para +pache.
!ara fazer o do,nload do mod1ws+i para 3indo,s " sem a necessidade de
compilar " v4 a esta p4gina da 3eb8
http://adal.chiriliuc.com/temp/mod_wsgi($.Dc$(re!_3K#(win32/
7scolha a opo mais adequada # sua verso.
9o caso que temos trabalhado Fpac!e #$# e P9t!on #$;G, a verso a escolher
esta8
mod_wsgi_py2#_apache22
Eaa o do,nload do arquivo %mod1ws+i$so%. 7le deve ser colocado na
seguinte pasta do H/8
.:,)r"ui!os de programas,)pache So&tware
-oundation,)pache2.2,modules
!ronto. Instalado. > um processo r5stico, mas simples.
Con,i+urando o pac!e para usar W(FI com o seu pro6eto
+gora, vamos modificar o +pache para que ele acesse seu pro%eto usando o
W(FI.
+bra o arquivo %!ttpd$con,% da pasta %C:Grquivos de pro+ramasGpac!e
(o,tware AoundationGpac!e#$#Gcon,% para edio e localize a seguinte linha8
/oadModule python_module modules/mod_python.so
+bai$o dela, acrescente mais esta8
/oadModule wsgi_module modules/mod_wsgi.so
Isto vai habilitar o mod1ws+i no seu +pache.
+gora localize este trecho de linhas8
E/ocation F/F@
Set7andler python(program
1ython1ath FG<c:/!ar/d'ango/pro'ects/site_meu_*log/meu_*log<H I sys.pathF
1ython7andler d'ango.core.handlers.modpython
Set5n! 04);:3_S566;:S_M309/5 settings
1ython0e*ug 3n
E//ocation@
Iemova5o. Ou se preferir, copie para um bloco de notas para consultar depois
se precisar.
JJ2
+gora escreva o seguinte cAdigo no mesmo lugar de onde removeu o anterior8
WS:Script)lias / Fc:/!ar/d'ango/pro'ects/site_meu_*l
og/meu_*log/deploy/de&ault.wsgiF
E0irectory Fc:/!ar/d'ango/pro'ects/site_meu_*log/meu_*log/deploy/F@
3rder denyCallow
)llow &rom all
E/0irectory@
;omo pode ver, fizemos uma refer6ncia para dizer ao +pache que as UP-s
iniciadas com uma barra Fou se%a8 todas* exceto Ys de arquivos est-ticosG devem
ser direcionadas para o script 3SMI no arquivo %de,ault$ws+i% da pasta %deplo9%
do pro%eto. 'e%a8
WS:Script)lias / Fc:/!ar/d'ango/pro'ects/site_meu_*l
og/meu_*log/deploy/de&ault.wsgiF
V4 no segundo bloco, nAs definimos a permisso para que o +pache acesse a
pasta deste script8
E0irectory Fc:/!ar/d'ango/pro'ects/site_meu_*log/meu_*log/deploy/F@
3rder denyCallow
)llow &rom all
E/0irectory@
Salve o arquivo. Eeche o arquivo.
Ieinicie o pac!e pelo cone na bande%a do 3indo,s, prA$imo ao relAgio.

'4 ao navegador e carregue a UP- do servidor8
http://localhost/
(as ve%a o que acontece8
JJ=

> que... +contece que este arquivo de script ainda no e$iste. !ortanto, vamos
cri4"lo& Se por acaso a mensagem de erro no navegador for algo parecido com
@Eorbiden...@ continue abai$o, pois esta normalmente a mensagem e$ibida quando
a pasta de deploy ainda no e$iste.
(cript para o pro6eto tra)al!ar com W(FI
+bra a pasta do pro%eto no servidor8
c:,!ar,d'ango,pro'ects,site_meu_*log,meu_*log
+gora crie a seguinte pasta " se ela ainda no e$istir8
deploy
7 agora dentro da pasta %deplo9%, crie um arquivo chamado %de,ault$ws+i%,
com o seguinte cAdigo dentro8
import osC sys
12345.6_2336_1)67 8 os.path.dirname(
os.path.dirname(os.path.a*spath(__&ile__))
)
sys.path.insert(DC 12345.6_2336_1)67)
os.en!ironG<04);:3_S566;:S_M309/5<H 8 <settings<
import d'ango.core.handlers.wsgi
JJ?
application 8 d'ango.core.handlers.wsgi.WS:7andler()
+gora observe o que fizemos8
9a primeira linha simplesmente importamos os pacotes de sistema operacional
e de sistema do !*thon.
import osC sys
9o bloco seguinte, nAs encontramos a pasta do pro6eto Fuma acima da pasta do
scriptG, inserimos seu caminho no incio da PJ'&H0P'& e definimos o
mAdulo de settin+s para o /%ango8
12345.6_2336_1)67 8 os.path.dirname(
os.path.dirname(os.path.a*spath(__&ile__))
)
sys.path.insert(DC 12345.6_2336_1)67)
os.en!ironG<04);:3_S566;:S_M309/5<H 8 <settings<
!or fim, importamos o handler do /%ango para trabalhar com W(FI e
declaramos a vari4vel %application% atribuda de uma instYncia do handler, ve%a8
import d'ango.core.handlers.wsgi
application 8 d'ango.core.handlers.wsgi.WS:7andler()
O 3SMI trabalha sempre procurando pela vari4vel %application% no script em
questo. !ortanto, no mude este nome, ele ,undamental.
Salve o arquivo. Eeche o arquivo.
Ieinicie o pac!e pelo cone na bande%a do 3indo,s, volte ao nave+ador,
atualize com A; e ve%a como ficou8
JJ1

> isso a& ;omo pode ver, agora temos o servidor trabalhando em W(FI&
6ustando o servidor para tra)al!ar compartil!ado
Um servidor compartilhado aquele que permite v-rios sites usando os
mesmos recursos. > uma alternativa de bai$o custo e bastante acessvel, onde a
quantidade de sites ativos pode ser at de 2HH sites, muitas vezes utilizando
tecnologias variadas como !H!, !*thon, Pub* e !erl numa sA m4quina.
(uitas vezes isso no uma boa escolha, mas claro que tudo depende de como
as limita:es tcnicas so e$ploradas.
O funcionamento de um servidor compartilhado em geral segue o seguinte
raciocnio8
0. ;ada site possui um arquivo de con,i+ura."o e uma pasta de
documentos. Pespectivamente semelhantes ao %!ttpd$con,% e # pasta R;8Z
+rquivos de programasZ+pache Soft,are EoundationZ+pacheJ.JZhtdocsR.
J. O arquivo de configurao acessvel somente ao administrador do
servidor. !ortanto, ele deve suportar que alguns a%ustes se%am feitos por
voc6 atravs de um arquivo chamado %$!taccess% na pasta de documentos
do seu site.
K. O arquivo %$!taccess% por sua vez declara algumas regras para liberar
JJD
alguns caminhos da pasta de documentos, e direcionar o restante para o
/%ango. !ara isso, ele precisa de um mAdulo do +pache8 p
%mod1rewrite%.
!ois bem. 9As vamos agora a%ustar o +pache para trabalhar com o mesmo
comportamento de um site de servidor compartilhado.
7nto, para comear, abra o arquivo %!ttpd$con,% da pasta %C:Grquivos de
pro+ramasGpac!e (o,tware AoundationGpac!e#$#Gcon,% para edio.
-ocalize e remova o seguinte bloco, %4 no final do arquivo8
WS:Script)lias / Fc:/!ar/d'ango/pro'ects/site_meu_*log/meu_*
log/deploy/de&ault.wsgiF
E0irectory Fc:/!ar/d'ango/pro'ects/site_meu_*log/meu_*lo
g/deploy/F@
3rder denyCallow
)llow &rom all
E/0irectory@
)lias /media F.:/!ar/d'ango/pro'ects/site_meu_*log/meu_*lo
g/mediaF
E0irectory F.:/!ar/d'ango/pro'ects/site_meu_*log/meu_*log/mediaF@
3rder allowCdeny
)llow &rom all
E/0irectory@
E/ocation F/mediaF@
Set7andler ;one
E//ocation@
Salve o arquivo. Ieinicie o +pache.
'e%a o resultado8
JKH

'oltamos # estaca zeroB 9em tanto. (as agora localize a seguinte linha no
arquivo8
%/oadModule rewrite_module modules/mod_rewrite.so
7 remova o caracter de coment4rio F [ G, para ficar assim8
/oadModule rewrite_module modules/mod_rewrite.so
Isso vai ativar o %mod1rewrite% no +pache.
+gora acrescente esse trecho ao final do arquivo8
)dd7andler wsgi(script .wsgi
E0irectory F.:/)r"ui!os de programas/)pache So&tw
are -oundation/)pache2.2/htdocsF@
)llow3!erride -ilen&o
3ptions 5+ec.: MultiViews -ollowSym/inJs
Multi!iewsMatch 7andlers
3rder allowCdeny
)llow &rom all
E/0irectory@
'e%a sA o que fizemos8
+qui nAs vinculamos uma extens"o de arquivo ao formato de script de 3SMI8
)dd7andler wsgi(script .wsgi
JK0
7 aqui, modificamos a configurao da pasta de documentos para suportar a
configurao do site usando %$!taccess% e scripts W(FI8
E0irectory F.:/)r"ui!os de programas/)pache So
&tware -oundation/)pache2.2/htdocsF@
)llow3!erride -ilen&o
3ptions 5+ec.: MultiViews -ollowSym/inJs
Multi!iewsMatch 7andlers
3rder allowCdeny
)llow &rom all
E/0irectory@
Salve o arquivo. Eeche o arquivo. Ieinicie o +pache.
'ra)al!ando na sua pasta de documentos
O prA$imo passo agora copiar a pasta de arquivos est-ticos do seu pro%eto
para a pasta de documentos. Isso necess4rio pois o Windows no tem suporte a
lin>s sim)Vlicos, um recurso do -inu$, (acOS . e outros sistemas operacionais.
;opie a pasta %media% do pro%eto e v4 ao navegador, carregue a UP- abai$o e
ve%a se o +pache a encontra8
http://localhost/media/layout.css
7le deve ser carregado assim8

JKJ
Isso indica que a pasta foi carregada corretamente e que o +pache a encontra da
forma esperada.
Eeito isso, ainda na pasta de documentos F %C:Grquivos de
pro+ramasGpac!e (o,tware AoundationGpac!e#$#G!tdocs% G, crie o arquivo
%$!taccess% com o seguinte cAdigo dentro8
2ewrite5ngine 3n
2ewrite.ond WX25A95S6_-/5;)M5Y T(&
2ewrite2ule Q(.R)S /site.wsgi/S$ GAS)C16C/H
'amos detalhar o que essas linhas significamB 'e%a8
+tivamos o rewritin+ da pasta de documentos. + partir desse ponto as UP-s
so direcionadas de acordo com as regras abai$o desta linha8
2ewrite5ngine 3n
/izemos que se o caminho da UP- requisitada e$istir na pasta de documentos,
ela ter4 prioridade sobre o /%ango. > esta linha que d4 vida # pasta %media%
trabalhando com arquivos est4ticos.
2ewrite.ond WX25A95S6_-/5;)M5Y T(&
/izemos que todas as demais UP-s Fque no e$istirem enquanto arquivos da
pastaG sero repassadas ao nosso pro%eto em /%ango. Pepresentado por um script da
pasta de documentos, chamado %site$ws+i%.
2ewrite2ule Q(.R)S /site.wsgi/S$ GAS)C16C/H
Salve o arquivo. Eeche o arquivo.
;omo pode notar, o arquivo de script %site$ws+i% de fato no e$iste. !ois ento,
ainda na pasta de documentos, crie um novo arquivo chamado %site$ws+i% com o
seguinte cAdigo dentro8
import osC sys
12345.6_2336_1)67 8 <.:/!ar/d'ango/pro'ects/site_meu_*log/meu_*log<
sys.path.insert(DC 12345.6_2336_1)67)
os.en!ironG<04);:3_S566;:S_M309/5<H 8 <settings<
import d'ango.core.handlers.wsgi
application 8 d'ango.core.handlers.wsgi.WS:7andler()
7ste script muito semelhante ao que criamos no incio do captulo, mas o
caminho do pro%eto F %C:KvarKd6an+oKpro6ectsKsite1meu1)lo+Kmeu1)lo+% G
JKK
apontado manualmente, sem uso de recursos do !*thon. Isso porque agora estamos
fora da pasta do pro%eto e no temos refer6ncia relativa a ela.
Salve o arquivo. Eeche o arquivo. 'olte ao navegador e carregue a UP- do site8
http://localhost/
7 ve%a que tudo voltou ao normal8

!ronto& Oemos agora o site funcionando novamente, porm desta vez usando
W(FI com rewritin+, um recurso fundamental para sites compartilhados.
+ora a ordem Z: evoluirE
+pAs essas aulas sobre deploy, +latazan decidiu por contratar um servidor
compartilhado, com -inu$, +pache e 3SMI. Eoi f4cil colocar seu site no ar, pois
como o servidor %4 estava devidamente configurado, seu trabalho se resumiu em
criar um lin> sim)Vlico para a pasta %media%, o arquivo %$!taccess% e o script de
W(FI apontando para seu pro%eto.
+inda assim, manteve a configurao no 3indo,s para testes eventuais.
'oltando para casa, um b6bado notou seus grandes olhos e tom peculiar de pele.
9um ataque de ecologismo, cambaleante e vendo dois ou tr6s +latazans de uma sA
vez, o b6bado se pSs a gritar8
7u vi uma zebra& 7u vi uma zebra&
O que ele ainda no havia entendido era o que a cor da pele e os olhos de
+latazan tinham a ver com a We)ra. Oalvez fosse seu subconsciente " tambm
JKN
muito tonto " se lembrando das notcias daquela manh.
+s notcias que vira na O' eram sobre sinais estranhos e ine$plic4veis,
dei$ados no meio de uma plantao de cana. -4 havia tambm uma toalha para
limpar o suor e uma lYmina de um metal desconhecido. +s e$press:es RapocalipseR,
Rsinais dos temposR e Rpre%uzo nesta safraR eram as mais comuns no vocabul4rio
do notici4rio, mas enfim, isso tabm no lembrava uma zebra. 7$ceto por aquela
zebra comendo cana no canto superior direito da tela da O'.
+latazan deu de ombros e continuou seu caminho, lembrando do que aprendeu
ho%e, que resumidamente foi8
;onfigurar um servidor +pache com 3SMI, usando mod1ws+iT
;riar script de 3SMI na pasta %deplo9% do pro%etoT
Habilitar o mod1rewrite no +pacheT
+tivar recursos e sobrecarga na pasta de documentos do +pache, para
suportar scripts 3SMI e o arquivo %$!taccess%T
;opiar a pasta %media% do pro%eto para a pasta de documentosT
;riar script de 3SMI na pasta de documentos para acessar o pro%eto.
7 foi sA isso mesmo& 9o outro dia, seria a vez de usar signals e @ILs
descomplicadas.
JK2