Você está na página 1de 235

Aprendendo Django no Planeta Terra - vol.

Marinho Brando
1 edio - 2009

Copyright 2008 por Jos Mrio Neiva Bra do

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 Bra do +-)ai", )ari ho-apre de dod.a go(!o) ///(apre de dod.a go(!o)

Licena

+sta o0ra e se$s perso age s so "i!e !iados so0 a "i!e a Creative Commons Atri !io-"so #o-Comercial-$edada a Criao de % ras Derivadas &.' Brasil 1 http,22!reative!o))o s(org2"i!e ses20y- !- d22(320r2 4( 5s pre)issas 0si!as desta "i!e a 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 origi a"7 da ;or)a espe!i;i!ada pe"o a$tor o$ "i!e !ia te( <so No-Co)er!ia"( 9o!: o pode $ti"i%ar esta o0ra !o) ;i a"idades !o)er!iais( 9edada a Criao de &0ras =erivadas( 9o!: o pode a"terar7 tra s;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!e a desta o0ra( ?$a"6$er $)a destas !o di@es pode) ser re $ !iadas7 desde 6$e 9o!: o0te ha per)isso do a$tor( Nada esta "i!e a atrapa"ha o$ restri ge os direitos )orais do a$tor(

& a$tor desta o0ra e de se$s perso age s +os, M-rio #eiva Brando 1!odi o)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)e tos(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((A =i!as para o apre di%ado(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((B 5prese tao(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((9 1( 5"ata%a !hega ao >"a eta *erra ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((11 2( & 6$e =.a goC Co)o issoC (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((1D D( Bai8a do e E sta"a do o =.a go (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((1A F( Cria do $) B"og )a eiro (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((2D 3( + te de do !o)o o =.a go tra0a"ha ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((D9 A( & #GG o e tregador ;ie" (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((F3 B( Ha%e do a aprese tao do site !o) te)p"ates (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((AF 8( *ra0a"ha do !o) ar6$ivos estti!os (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((82 9( >gi as de !o teIdo so H"at>ages (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((9F 10( >er)iti do !o tato do o$tro "ado do < iverso ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((101 11( =ei8a do os !o)e trios ;"$Jre) ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((11B 12( <) po$!o de K*M' e CGG sL ;a% 0e) ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((1D0 1D( <) po$!o de >ytho agora (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((131 1F( 5.$sta do as !oisas para !o"o!ar o ar ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((1A8 13( E ;i itas ;or)as de se ;a%er dep"oy((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((1B3 1A( >repara do $) servidor !o) Mi do/s (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((183 1B( >repara do $) servidor !o) 'i $8 ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((203 18( MGNE e Gervidores !o)parti"hados ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((22F $ol!me & =i!as para o apre di%ado 19( Gig a"s e <#'s a)igveis !o) G"$gs 20( <)a ga"eria de i)age s si)p"es e Iti" 21( &rga i%a do as !oisas !o) *ags 22( & )es)o site e) vrios idio)as 2D( Ha%e do $) siste)a de Co tas >essoais 2F( Ha%e do )ais !oisas a ap"i!ao de Co tas >essoais 23( 5 ap"i!ao de Co tas >essoais sai do 0a!Ostage 2A( Gepara do as !o tas pessoais para $s$rios 2B( H$ @es de $s$rios 28( >rogra)a do !o) testes a$to)ati%ados 29( Cria do ;erra)e tas para a "i ha de !o)a do D0( 5de tra do a se"va e !o he!e do os verdadeiros 0i!hos

$ol!me 1

Agradecimentos

K diversas pessoas a agrade!er7 )as os o)es )ais ;ortes 6$e te ho pra !itar so estes,

Me%i ha e >ai%i ho 'etJ!ia e *arsi"a Mi"ti ho e 9eri ha My!he"" e Joo Mathe$s 5 dre/s Medi a7 N$i"her)e Ge)e te e Betty 9oge" =o$g"as 5da)s7 He"ippe e =o a"dso Nardi &s dese vo"vedores do =.a go 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 tor asse rea"( *odo agrade!i)e to e dedi!atLria so po$!os dia te do 6$e re!e0i de"es(

Dicas de Aprendi/ado

5 tes de e trar de !a0ea a "eit$ra do "ivro7 0o) )a ter e) )e te a"g$ s pri !Jpios 6$e vo ;a!i"itar a !o)pree so7 )a ter a !a")a e) a"g$ s )o)e tos e ;orta"e!er o apre di%ado( 9e.a a0ai8o,

#o copie e cole2 digite


5 pior !oisa a ;a%er para se apre der a"go 0$s!ar o ata"ho de !opiar e !o"ar7 !o) a6$e"a ve"ha a$to-i"$so Pahh7 . e te di isso7 vo$ !opiar e !o"ar sL pra !o ;ir)ar 6$e e$ e te diP( Esso o cola - o$ pe"o )e os o !o"a a s$a )e)Lria( =igite !ada !o)a do7 !ada "i ha7 !ada !oisi ha7 ;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)e to i i!ia" ;eito assi) por s$a prLpria at$re%a( Q )edida 6$e a"g$)as !oisas so e8p"i!adas deta"hada)e te7 e"as passa) a ser apo tadas de ;or)a )ais o0.etiva da"i e) dia te7 e !oisas e) ;o!o a6$e"e !apJt$"o passa) a ser )ais deta"hadas( 5ssi)7 se vo!: !o ti $a pe sa do 6$e o "ivro est deta"ha do de)ais7 $) 0o) si a" de 6$e apre de$ as "i@es dos !apJt$"os a teriores de ta" ;or)a 6$e e) oto$( >ara0 sR

#o e3iste m-gica2 no se il!da com isso


& =.a go o $)a ;erra)e ta )gi!a( M$ito )e os de tr$6$es( 5 prod$tividade do =.a go est "igada a tr:s !oisas )$ito i)porta tes,
4rame5or6. *ra0a"har !o) $) ;ra)e/orO )ais prod$tivo si)p"es)e te por6$e vo!: o ;a% !oisas 6$e . esto pro tas e "evara)

a os para sere) !riadas de ;or)a 6$e vo!: possa $sar ;a!i")e te agora( +sse va"or sL te) essa ;ora e di S)i!a por6$e o =.a go so7t5are livre(
Conhecimento. & se$ !o he!i)e to do =.a go e de !o !eitos apro;$ dados de 8e 7 Programao %rientada a % jetos e Bancos de Dados ;a% *&=5 a di;ere a( P0thon. T $)a "i g$age) de ;!i" !o)pree so7 o 0$ro!rti!a e prti!a( M$ito prti!a( Esso evita 6$e se$ !re0ro se per!a e) i terpretar !oisas e sJ)0o"os 6$e o pre!isaria i terpretar e )a te ha o ;o!o a so"$o(

>orta to7 o e8iste) ata"hos7 e) vida ;!i"7 )as vo!: pode ;a!i"itar as !oisas e se divertir !o) isso7 $sa do as ;erra)e tas !ertas7 e agi do !o) ;o!o e persist: !ia( + to7 $)a 0e"a )a h vai per!e0er 6$e est prod$%i do !o) 6$a"idade e rapide%7 por se$s prLprios )ritos(

$erso do Django
5 verso do =.a go adotada esta srie a verso 1.9.&( 5"g$)as pessoas t:) e !o trado a"g$)as di;i!$"dades e) de!orr: !ia de $sare) $)a verso di;ere te( K di;ere as e tre vers@es e) aspe!tos 6$e te)os tra0a"hado7 porta to7 $se a verso 1.9.& o! s!perior(

4i:!e ligado nas e3tens*es do ar:!ivos


No 8indo5s7 o padro o!$"tar as e8te s@es dos ar6$ivos( >or e8e)p"o, para $) ar6$ivo .teste.t3t.7 ser e8i0ido ape as !o)o .teste.( Esso tre)e da)e te !hato para o dese vo"vedor( >ara ;a!i"itar a s$a vida7 v $)a .a e"a do ;3plorer7 ao )e $ 4erramentas -U %p*es de Pasta e desa0i"ite a opo 6$e vo!: ve a i)age) a0ai8o(

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 m sica, 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-oiniciante-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 !onsole ou %erminal) e locali9e a pasta criada com*
cd c:#$rojetos

ac 4 o

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 gerarJbancoJdeJdadosBbat e escreva o seguinte c+digo dentro*
python manage.py syncd! pause

chamado

=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 http#IIlocalhost#VEEEIadminI, apontada para a interface de administra()o. 4 a

&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 !onte do. 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 fa9 parte do Django em si. G/, pois n)o

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!trasde 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 Podca t 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.

'(u tando 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 config!ra(es !e determinam a s!a essncia. etting +p,, onde so feitas

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 decre cente. +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.nowb)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.nowb)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 re peitar a edentao. A padro mais indicado no 4Bt&on !e se!s blocos se2am sempre edentados a cada 5 e pao , 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 cla e 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 de crio 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 /de cription+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 li ta 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 removero! do mtodo get/ab olute/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.nowb)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 ab oluto 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 motivo:

!eramos... *as isso acontece! pelo seg!inte

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 u ando 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 2 ite2 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:@@local3o t:DEEE@, certoJ Carreg!e o endereo do ad"in no navegador:
http://)o$a)host:?333/admin/

Na caixa 9Site 9, cli !e no item 9Site 9. Na p"gina carregada, cli !e sobre 9e!a"ple+co"9, e modifi !e, s!bstit!indo 9e!a"ple+co"9 para 9local3o t: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 pa ta 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 e pecfico. 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!i te2. %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 indi !e !e elas existem, e de onde elas vm. !e alg!m

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 no o 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 $i ual 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 apre entao 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 "otori ta e o $i ual 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 e t% longe de er u"a bele?a.

#nto $a"o trabal3ar no te"plate I


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 intere ante 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 a i"& Alata#an tambm no. 0nto vamos criar !m CSS para mel&orar isso. C%% significa Ca cading 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&8united tatesS 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"e ince, 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$o 2 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 late t 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 re trito 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"plate 2 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 pa ta 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"plate 9 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" fi)e if (sing s8)iteR. @ Or path to database

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"po io. 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"po io 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"plate 2 do pro(eto , "eu/blog@te"plate -, crie !m novo ar !ivo, c&amado 2ba e+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 ba e+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 2ba e+3t"l2 RG no incio do template. : ela !em di# !e este template ser" !ma e!ten o da !ele !e criamos , ba e+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 e ti$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 , ba e+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 coi a +++


%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 e t%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 e t%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! e t%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 e t%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 TTblog@te"plate @blog para edio, e locali#e a seg!inte lin&a:
7A b)o$k $onte(do A9

da

pa ta

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 arHui$o e t%tico do pro2eto.

!e contm

@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 e ta o a "el3ore pr%tica A ento porHu6 e a etting (% no $6" de a 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 de en$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 .#D-'/ROOTJ A seg!nda d" s!porte = primeira.

settings

.#D-'/:R7

*as o elemento etting +.#D-'/ROOT ali no vai f!ncionar, pois preciso di#er !em o 2 etting 2 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 e t%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 ba e+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+c 2 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 exceto pela a!sncia das tags W t,leQJ

!e removemos do template ba e+3t"l,

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 e t%tico para a p%gina plana I


A tempo passo! voando e Alata#an 2" estava c!rioso em con&ecer ferramentas para a criao de imagens: o -n4 cape 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 simples entender !e: !e voc aprende,

: 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 Plana 2, 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 preci o "uito e foro 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 Plana 2 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: e te(a li$re para infor"ar o te!to co"o Hui erA "a faa Hue to Hue e e te!to ten3a "ai de u"a lin3a %ites: local3o t:DEEE 7ma informao importante a !i: no e e Huea 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"plate 2. 1entro da pasta 2te"plate 2, crie !ma nova pasta, c&amada 2flatpage 2. 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 lin3a J %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$er o

%&&&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, preci o ter u" "eio para receber contato de o!tras pessoas, no i"porta Huo di tante ela e te(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

%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()omessage!te1tofrom_emai)!destinore$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()omessage!te1tofrom_emai)!destinore$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 su o 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 gague ou, 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 a ustar alguns templates. 2amos l3 Antes de mais nada, e$ecute seu pro eto clicando duas vezes sobre o arquivo "executar.bat" da pasta do pro eto. &a pasta do pro eto, 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 se a, 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 pro eto4 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 pro eto. #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 a ustes que ela sofreu para a (ers)o 1.*, poss/vel que em sua vers'o ela ainda n'o este a 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 pro eto, 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 t e ne.t t/o $ines to enab$e t e 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.arc i0e_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 pro eto, 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 ve a 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 ob eto "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 pro eto, 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 eig t& @))".B 4

9alve o arquivo. :eche o arquivo. 2olte ao navegador, atualize e ve a 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 ve a 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 6 r'7 6'di07 2= end#or =4

9alve o arquivo. 2olte ao navegador, atualize a pgina do artigo e ve a 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 ob eto "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 se a, 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 6 r'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 ve a como vai ficar antes de enviar. =sso !til para que ele tenha uma segunda chance de a ustar 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 ve a 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 pro eto, 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 se a, eles ser'o encai$ados no seu visual. 2olte ao navegador, pressione 8C , ser feita uma pergunta sobre os dados enviados, apenas confirme , e ve a como ficou4

J melhorou, n3 Agora, clique no bot'o "'ost" para publicar esse comentrio. 2e a4

5C6

2e a que nesta pgina a mudana no template tambm surtiu efeito. .as precisamos a ustar 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 pro eto, 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 ve a 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 ho e4
=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 a ustar as pginas de comentrios ao layout do siteN

E$atamente) E voc( ainda fez um a uste 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 pro eto, clicando duas vezes no arquivo "executar.bat" da pasta do pro eto. <ois bem, vamos comear pelo template mais bsico de nosso site. Aquele que todos e$tendem4 o "base.4tml", da pasta "templates" do pro eto. 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 6 tm$ .m$ns= > tt"&''///./?.org'@MMM'. tm$> .m$&$ang=>"tEbr> $ang=>"tEbr> 7 6 ead7 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 c arset=ut#E(> '7 6meta tt"Ee3ui0=>ContentELanguage> content=>"tEbr> '7

6meta name=>Ae!/ords> content=>P!t on, 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!$es eet> 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 6$i76a 6$i76a 6'u$7 2= ends"ace$ess =4 2= endb$ocA menu =4 6'di07 re#=>'>7Pagina inicia$6'a76'$i7 re#=>'sobreEmim'>7Sobre mim6'a76'$i7 re#=>2= ur$ 0ie/s.contato =4>7Contato6'a76'$i7

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 6 tm$ .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 se a, 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 con unto 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 c arset=ut#E(> '7

Esta acima define o padr'o de caracteres utf@I, ou se a, +nicode, o con unto 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!t on, 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 ve a 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 a ustar nosso laFout para ficar assim4

5IM

<ara faz(,lo, v % pasta do pro eto 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 ve a 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

9alve o arquivo, atualize o navegador e ve a 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 ve a 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& rig tB bacAgroundEimage& ur$('media'#oto.j"g%B bacAgroundEre"eat& noEre"eatB bacAgroundE"osition& ER)". E?)".B /idt & UT".B eig t& UT".B border& @". so$id ,VSaB 4

9alve o arquivo, atualize o navegador e ve a 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& bot B 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 ve a 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& bot B o0er#$o/& iddenB

bacAgroundEco$or& ,VSaB marginEto"& @)".B eig t& RT".B #ontEsiNe& ).(emB #ontE/eig t& 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 ve a 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 ve a 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 eig t& @))".B 4

2 te.tEa$ign& rig tB "addingErig t& U".B

'+ Comentarios +'

.comentarios 2 borderEto"& @". so$id si$0erB marginEto"& R)".B 4

.comentarios

r 2

borderE/idt & )B eig t& @".B borderEto"& @". so$id ,dddB 4

9alve o arquivo. :eche o arquivo. Garregue no navegador o endereo do artigo4


tt"&''$oca$ ost&()))'artigo'@'

E ve a como ficou4

5LL

<ois bem, agora ve a 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& rig tB bacAgroundEimage& ur$('media'#oto.j"g%B bacAgroundEre"eat& noEre"eatB bacAgroundE"osition& ER)". E?)".B /idt & UT".B eig t& UT".B border& @". so$id ,VSaB 4

.cor"o 2

margin& R)". R)". ) R)".B

.roda"e 2 c$ear& bot B 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& bot B o0er#$o/& iddenB

bacAgroundEco$or& ,VSaB marginEto"& @)".B eig t& RT".B #ontEsiNe& ).(emB #ontE/eig t& 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 eig t& @))".B 4

5L;

2 te.tEa$ign& rig tB "addingErig t& U".B

'+ Comentarios +'

.comentarios 2 borderEto"& @". so$id si$0erB marginEto"& R)".B 4

.comentarios

r 2

borderE/idt & )B eig t& @".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 se a 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 se a 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 a uste. &a pasta "templates" da pasta do pro eto, 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 ho e 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 ob etos?, 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 ob etos, 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, ve a esta pgina da Ueb4
tt"&''///."!t on.org'do/n$oad'ot er'

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 "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

com

nome

, 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
"!t on testar_caracteres."!

9er e$ibida a seguinte mensagem de erro4


Wi$e >testar_caracteres."!>, $ine U S!nta.Error& NonEASCII c aracter '8.cM' in #i$e testar_caracteres."! on $ine U, but no encoding dec$aredB see )RT?. tm$ #or detai$s tt"&''///."!t on.org'"e"s'"e"E

=sso acontece porque o seu comentrio da linha K possui um "Y" acentuado, ve a4


, 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 se a, 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


"!t on testar_caracteres."!

Agora ve a 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 a udasse 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 > : ?. 2e a 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, ve a4
im"rimir_duas_0eNes('Tarsi$a do Amara$'%

Ou se a, 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 pro etos usando esta ferramenta, que muito prtica tambm para o aprendizado.

"ipagem
&o <Fthon, a tipagem dos dados e ob etos 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 se a e$ibido

na linha de bai$o, ou se a4 /$eticia/N


?. na linha seguinte, informamos o atributo interno do <Fthon que retorna

a classe daquele ob eto, 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

2e a que o valor "FI" foi interpretado como n!mero inteiro > "Mtype /int/N" ?. 2e a 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 777 oje = date.toda!(% 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 ob eto 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 ob eto, ve a4
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 se a 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& ... ... ... ... ... ... ... ... ... ... ... 777 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

<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 se a, caso n'o se a especificado, ele assumir o valor 1*. Agora escreva as seguintes linhas de c7digo na sequ(ncia4
777 m!c e$$ = Pessoa(% 777 m!c e$$.nome = ':!c e$$' 777 m!c e$$.idade = @U 777 m!c e$$.nome ':!c e$$' 777 m!c e$$.idade @U 777 m!c e$$.andar(% Andou @) "assosG 777 m!c e$$.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*. 2e a4
777 m!c e$$.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!c e$$.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, ve a4
777 de# inicia$iNador(se$#, nome, idade, nota=None, mu$ er=None%& ... ... ... ... ... 777 Pessoa.__init__ = inicia$iNador se$#.nome = nome se$#.idade = idade se$#.nota = nota or se$#.nota se$#.mu$ er = mu$ er is not None or se$#.mu$ er

2e a 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 se a, 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 ve a 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 se am 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 se am 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
, $in a comentada 3ue sera ignorada da mesma #orma , 3ue esta outra $in a

ou assim4
>>>$in a comentada 3ue sera ignorada da mesma #orma 3ue esta outra $in a>>>

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. 2e a com seus pr7prios olhos4
777 e$"(Pessoa% Le$" on c$ass Pessoa in modu$e __main__&

c$ass Pessoa D D D D D D nome = None idade = R) Data and ot er attributes de#ined ere& C$asse "ara atribuicao a "essoas do sistema

)o ; fantsticoJ

8unBes dir-. e 4elp-.


Alis, falando em fun'o 4elp-., ela uma forma muito bacana de aprender <Fthon, ve a4
777 im"ort datetime 777 e$"(datetime%

Le$" on bui$tEin modu$e datetime&

NA:E datetime E Wast im"$ementation o# t e 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"!t onRU8$ib8ur$$ib."!

DESC;IPTI<N See t e #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 t e LTTP s"ec (#rom / ic deri0ed%&

t e error codes are

>LTTP E L!"erte.t Trans#er Protoco$>, at

EEEE cortamos deno0o

=sso muito !til e a uda bastante. E t'o !til quanto a fun'o 4elp-. a fun'o dir-., ve a
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# t e 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, ve a que muito fcil casar classes com funAes de formas variadas. @ por isso que e$istem tantos frameworks criados em <Fthon)

5MM

Gartola a ustou 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 se a 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 ob etos, 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 man ado. 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 pro eto 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 pro eto clicando duas vezes sobre o arquivo "executar.bat" da pasta do pro eto. <rimeiro de tudo, abra o arquivo "settings.py" da pasta do pro eto para edi'o. 2amos pensar as settings do pro eto na seguinte divis'o4

R algumas settings que s'o muito relativas ao ambiente ao qual seu pro eto 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 pro eto, mas a pasta do pro eto 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 pro eto, 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 pro etos, esta a !ltima linha de um grupo de settings que variam muito de acordo com a situa'o atual do pro eto. Abai$o desta linha est'o aquelas settings que se a ustam a elas, ou que n'o se a ustam 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 pro eto est rodando. 2e a o que aconteceu4

O erro que surgiu este4


Error& Can't #ind t e #i$e 'settings."!' in t e director! containing 'manage."!'. It a""ears !ou'0e customiNed t ings. Hou'$$ a0e to run djangoEadmin."!, "assing it !our settings modu$e. (I# t e #i$e settings."! does indeed e.ist, it's causing an Im"ortError some o/.%

Ou se a, nosso pro eto 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 pro eto novamente, clicando duas vezes sobre o arquivo "executar.bat" da pasta do pro eto. &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 se a 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. 2e a que apenas erros de importa'o est'o sendo suportados aqui, ou se a, 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 pro eto, 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 pro eto 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 pro eto 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 pro eto estiver em mquina local, ou se a, 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 t e ne.t t/o $ines to enab$e t e 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.arc i0e_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 pro eto 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 pro eto em mais de um ser(idor ou de mSltiplos sites em um s7 pro eto. 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 dese ada 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 pro eto 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 pro eto trabalha de uma forma transparente em rela'o % 'L"HK '#"H , o con unto de pastas reconhecidos pelo <Fthon em sua mquina virtual para encontrar pacotes e m7dulos. +esta forma, quando seu pro eto for lanado ao servidor, vamos adicionar a pasta do pro eto % 'L"HK '#"H e tudo estar resolvido. 9alve o arquivo. :eche o arquivo. <ronto. Os primeiros passos para levar o pro eto ao servidor s'o esses.

Vamos adianteJ
Alatazan perguntou, s7 pra confirmar4 Ent'o o pro eto 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 pro eto, como EIDD$%X#,%&C$#!!%! ou I !"#$$%D&#''! por e$emplo. 1embrando que o arquivo "settings.py" deve permanecer com as configuraAes ideais para o pro eto, ou se a, 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 pro eto 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 pro eto para o servidor, voc( fizer mudanas em outras partes do c7digo, muito provvel que este a 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 ho e 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 pro eto 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 laran a >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 pro eto. <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 pro eto 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 pro etos 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 vanta osa 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 dese veis 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 pro eto em + ango, preciso ter uma interface, que possibilita ao servidor o recon4ecimento de softTare escrito em <Fthon, que o caso de pro etos 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 se a instalado entre os pacotes oficiais do <Fthon, pois pode simplesmente ser colocado na mesma pasta do pro eto, 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 pro eto, 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 se am 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 pre udicada, e caso se a configurado para ocupar muita mem7ria, os arquivos estticos ser'o os pre udicados. <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 pro eto em + ango e $ig4ttpd para arquivos estticos.

'ro0eto do site
O pro eto 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 pro eto est'o organizadas. R infinitas formas de se fazer isso. #ma boa forma para organizar a pastas de pro etos 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 pro eto, 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 pro etos em um !nico servidor. pro0ects &esta pasta ser'o instaladas as pastas de pro etos. Ou se a, 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 pro eto, crie uma pasta para o site e dentro desta pasta, coloque a do pro eto, pois um site mais do que o pro eto. @ muito provvel que voc( v querer documentar seu site, adicionar alguns arquivos de hist7rico e definiAes, bac",ups e outros, portanto, o pro eto n'o se limita aos arquivos,fonte em + ango. Agora, dentro da pasta do site do pro eto, est a pasta do pro eto 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 pro eto >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 pro eto h outra pasta aqui4 dependencies Esta pasta deve conter um arquivo chamado ,%#DE% onde voc( ir escrever as depend(ncias de seu pro eto. E$emplos4 se seu pro eto trabalha somente na vers'o 5.D.C do + ango, escreva isso nesse arquivo. 9e seu pro eto 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 pro eto. =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 a uda 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 ho e3 , 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 ho e s'o os diagramas, observe,os novamente, e n'o se limite a isso. 9ervidores s'o evolu/dos e a ustados 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 m e, segurando firme seu i!od. O ndio de pele vermelha " n o se sabe se era devido ao Sol, devido # terra avermelhada da regi o 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 n o para de chorar, agora sentado com sua m e, assistindo aos colegas terminarem a pea, morrendo de inve%a porque n o ia ganhar os aplausos do teatro e nem o novssimo (eleca)o* verde, uma nova mania gosmenta da sess o 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 s o Linux. !or alguns motivos, em grande parte dos casos os sistemas de padr o Uni$, como -inu$, Solaris e (acOS ., s o 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 s o semelhantes nos dois sistemas operacionais, e a parte mais importante " a configura o 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 n o se tratam de recursos conflitantes. 7sta uma situa o 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 instala o8
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 vers o 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 bot o %0ext% e ve%a a %anela seguinte8

(arque na primeira op o, 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 n o 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 instala o, verifique o cone do 3indo,s, prA$imo ao relAgio8 pac!e na )ande6a do

+gora v4 ao navegador e carregue o seguinte endereo8


http://localhost/

Observe que desta vez n o informamos a porta, pois estamos indicando que ela deve ser a porta &''P padr o8 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

+ vers o mais indicada a vers"o ;$1. 9a op o %Windows 4ssentials <x76=%, clique no lin< %Pic> a mirror%.

01D

Ser4 requisitado um cadastro gratuito, apenas para fins de propaganda mesmo. Eaa"o Fn o 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 instala o do (*SC- no 3indo,s.

Siga clicando no bot o %0ext% at finalizar a instala o. +o final ser4 e$ibida uma nova %anela para configura o do (*SC- Fque por sinal muito semelhante #s %anelas de instala oG.

0DH

!rossiga clicando sobre %0ext%, modificando as op:es padr o somente se estiver certo de tal mudana. +t chegar a essa tela8

7scolha a segunda op o F %?est (upport ,or Multilin+ualism% G. Isso vai tornar a codifica o de caracteres padr o 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 t o f4cil de ser quebradaB Simples8 para que voc n"o o ,a.aE !rossiga clicando em %0ext% at executar a configura o e conclu"la. !ronto& +gora temos o (*SC- rodando em seu servidor 3indo,s&

0DJ

P9t!on e B6an+o
;aso esta m4quina n o possua !*thon ou /%ango, faa a instala o seguindo os mesmos passos do captulo K " ?aixando e Instalando o B6an+o " com a diferena que desta vez n o 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 op o %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 instala o 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 op o 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 n o 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 vers o 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 vers o do !*thon F #$; G e a sua vers o 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 instala o.

0DN

+gora abra o seguinte arquivo para edi o, 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 n o 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 configura o 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 %C:GvarGd6an+oGpro6ectsGsite1meu1)lo+Gmeu1)lo+% G abra o %local1settin+s$p9% para edi o 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__))

F arquivo

/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 ' ? (410 M4, o banco de dados dever4 ser chamado %meu1)lo+%. 9o menu %Iniciar% do 3indo,s, escolha a op o %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 configura o 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 gera o 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:G rquivos de pro+ramasG pac!e (o,tware AoundationG pac!e#$#Gcon,G% para edi o 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 configura o 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, ent o todos os mAdulos F arquivos com e$tens o %$p9% G que est o na pasta do pro%eto podem agora ser informados com seu 5nico nome, pois eles est o 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 configura o. 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 op o %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 n o tem nenhum intermdio do /%ango. > apenas um endereo do +pache que aponta para uma pasta no H/. 'amos l4B 'olte ao arquivo de configura o 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 configura o, portanto fique atento aos espaos ou # falta deles... um bom e$emplo a parte Rallo,,den*R que n o 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 n o suficiente, pois preciso dar permiss o # pasta indicada, portanto, este bloco abai$o d4 a permiss o 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 op o %Iestart% para aplicar a mudana que fizemos. 'oltando ao navegador, pressione A; e ve%a como ficou8

JHH

SatisfeitoB (as como pode notar, n o 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 n o 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 % BMI01M4BI 1PI4AIM%. !ortanto, volte ao arquivo de configura o 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 n o 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 n o a minha praia n o... " 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, n o sou eu n o hein, gosto de coisa com mais estilo. +latazan me$eu sua peruca desalinhado, fez de conta que n o ouviu e tratou de voltar ao assunto8 )om, ent o 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, n o se prenda #s versNes secund4rias, apenas atenha"se a pegar a vers o est4vel mais recente. Meralmente funciona melhor. 7 sA completando, meu camarada... quando ela fala em vers o 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 aten o 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. 9 o queria usar sua instala o 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 m e mandou. + defini o mais comum da palavra Rm eR 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 m e de +latazan n o foge # defini o, e nas cai$as que mandou est o 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 n o 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 n o sabia mais onde as cuecas estavam. !or isso, os pacotes de sua m e 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. 9 o que 3indo,s trabalhe melhor com (*SC- ou -inu$ trabalhe melhor com

JH2

!ostgreSC-, n o 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$, n o se esquea de que preciso ter o controle total do sistema, do contr4rio n o ser4 possvel instalar os soft,ares que vamos instalar nem mesmo configur4"los. !ortanto, a recomenda o que agora voc6 use sua instala o 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 est o 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 op o o Tirtual?ox8
http://www.!irtual*o+.org/

+mbos s o 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$ n o 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 instala o dos pacotes e espere pela conclus o da instala o. +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 instala o dos pacotes e aguarde pela conclus o. +ssim como aconteceu com o -ighttpd, ao concluir a instala o, 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 opera o 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=#><?

9 o 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 sess o 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 # sess o 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 FpostgresF dent &alhou para o usuNrio

'e%a bem8 quando acessamos o psql usando uma sess o do usu4rio %post+res% do -inu$, a autentica o foi aceita sem nem mesmo requisitar senha, mas agora que usamos uma sess o do seu usu4rio, mesmo informando a senha correta a autentica o foi re%eitada. !orqu6B !orque e$iste uma configura o que determina isso. 'amos mudar essa configura o. /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 sameuser postgres ident

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 autentica o 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 n o 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, vers o 7$18 " basta digitar a seguinte linha de comando8
sudo apt(get install python(d'ango

+pAs confirmar e concluir a instala o, seu servidor %4 ter4 o /%ango na vers o 0.H " no mnimo " devidamente instalada. V4 nas demais vers:es do Ubuntu -inu$, isso n o recomend4vel, pois a maioria delas ainda tem esse pacote em uma vers o 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 instala o 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 revis o da vers o 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 instala o 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 instala o 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 vers o 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 instala o, %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. 7nt o, 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 s o semelhantes, outras n o... !ara comear, crie a nossa pasta de coisas em /%ango no servidor, assim8
sudo mJdir /!ar/d'ango sudo chown S59_9S9)2 3 /!ar/d'ango sudo chgrp S59_9S9)2 3 /!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 v o8 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% %local1settin+s$p9% para edi o8


cd meu_*log nano local_settings.py

G,

abra

arquivo

(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.2 16_;)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-. 9 o 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 modifica o trata"se desta linha8
-32.5_S.2 16_;)M5 8 <<

7la ter4 o papel de ocultar o nome interno do script do East;MI, e caso n o 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+%, ent o 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$press o 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 codifica o 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

9 o se preocupe em comparar tudo. Se n o 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 configura o do -ighttpd para reconhecer o seu pro%eto, certoB 7nt o vamos l4& /igite as seguintes linhas de comando8
cd /etc/lighttpd/con&(a!aila*le ls

'e%a o resultado8
D#(auth.con& userdir.con& $D(cgi.con& $D(&astcgi.con& $D(pro+y.con& $D(rrdtool.con& $D(simple(!host.con& $D(ssi.con& $D(ssl.con& $D(status.con& $D( 25)0M5

7sses arquivos s o 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 edi o, 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$press o 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 configura o. !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 n o 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 n o 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 defini o da vari4vel de ambiente %BX 0FH1(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 fun o 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 R Starting we* ser!er lighttpd G 3B H 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 edi o 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 s o UP-s simples para pastas de arquivos est4ticos e devem fazer e$atamente isso8 retornar arquivos est4ticos do H/ no caminho definido. Observe com aten o 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 vers o #*D do !*thon como padr o.
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&

(iss o 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 n o quis corrigir o aliengena e quebrar sua empolga o. (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 depura o 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 n o 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 n o 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 popula o 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 n o 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 op o mais adequada # sua vers o. 9o caso que temos trabalhado F pac!e #$# e P9t!on #$;G, a vers o 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:G rquivos de pro+ramasG pac!e (o,tware AoundationG pac!e#$#Gcon,% para edi o 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 permiss o 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 n o 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 n o 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 n o 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 quest o. !ortanto, n o 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 n o uma boa escolha, mas claro que tudo depende de como as limita:es tcnicas s o 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 configura o 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. 7nt o, para comear, abra o arquivo %!ttpd$con,% da pasta %C:G rquivos de pro+ramasG pac!e (o,tware AoundationG pac!e#$#Gcon,% para edi o. -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 -ile n&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 configura o da pasta de documentos para suportar a configura o do site usando %$!taccess% e scripts W(FI8
E0irectory F.:/)r"ui!os de programas/)pache So &tware -oundation/)pache2.2/htdocsF@ )llow3!erride -ile n&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 n o 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:G rquivos de pro+ramasG pac!e (o,tware AoundationG pac!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 s o 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 n o e$istirem enquanto arquivos da pastaG ser o 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 n o e$iste. !ois ent o, 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 n o 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 configura o 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 n o 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 planta o 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 n o 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

Você também pode gostar