Vous êtes sur la page 1sur 47

Programacin Web con Python

Miguel Hernndez Martos <enlavin@gcubo.org> Ingeniera y Control Remoto S. . !aniel Molina Cabrera <daniel.molina@"is#alinu$.es> !%CS I &!e#artment o' Com#uter Science and I(

Programacin web

)rotocolo H**) Carencia de estado en el cliente Inter'aces de usuario de'inidas con H*M+ ,eneralmente multi#lata'orma

Alternativa 1: CGI

Common ,ate-ay Inter'ace 'avor

*ecnologa veterana y muy #robada .astante sim#le Muy 'cil encontrar servicios de "osting

%n contra

Menor e'iciencia /ue otras alternativas 0os "ace #rogramar /uic12n2dirty

Alternativa 2: Zope

'avor

Muy alto nivel !ise3o orientado a ob4etos

%n contra

%levada curva de a#rendiza4e %dici5n #or -eb !*M+ Consume muc"os recursos %scasa documentaci5n avanzada

Alternativa 3: Webware

'avor

Ms r#ido /ue C,I y ms sim#le /ue 6o#e Com#leto 'rame-or1 orientado a ob4etos ce#ta di'erentes modelos de desarrollo

Servlets &con o sin #lantillas( )S)7 )yt"on Servlets )ages

Integraci5n sencilla de soluciones antiguas basadas en C,I &C,I8it(

%n contra

0o es tan estndar como C,I 0o es 'cil encontrar "osting &como con 6o#e(

%stu#endo9 #5ngame : 7(

!" e# Webware$

%scrito y #ensado en )yt"on ;rientado a ob4etos r/uitectura modular ;#en Source Multi#lata'orma

+inu$<=ni$ >indo-s 0*<:1<?)<:@@A

%&!lo# Webware

+a 'uncionalidad de >eb-are se organiza en m5dulos inde#endientes

Web'it7 servidor de a#licaciones P(P: )yt"on Server )ages9 #arecido a BS) )#er'it7 mane4o de usuarios %i&&le'it7 middle-are &ob4ect<relational ma##er( *a#+'it7 gesti5n de tareas #eri5dicas Cheetah7 motor e$terno de #lantillas

0os centraremos en >eb8it y )S)

Web'it

Servidor de a#licaciones r#ido y sencillo Ctiliza "ebras #ara la concurrencia


,esti5n ms sim#le de la #ersistencia Dunciona bien en +inu$<=0I? y >indo-s

%stable y maduro ce#ta di'erentes modelos de desarrollo -eb


Servlets )yt"on Server )ages

Ar,!itect!ra
Browser
!"

cliente XML-RP
!"

Apache
WebKit$c%i !"!# mod_webkit !"!#

WebKit
Servlets PSPs

ontenido &statico

Com!nican&o con el #ervi&or web: A&apta&ore#

+os ada#tadores conectan a >eb8it con el servidor -eb

-ne(hot.cgi/ Web'it.cgi7 escritos en #yt"on w+cgi7 versi5n en C de >eb8it.cgi


Ms r#ido /ue >eb8it.cgi Scri#t lias <-1 E<usr<lib<cgi2bin<-1cgiE %l ms r#ido de los ada#tadores Con'iguraci5n un #oco ms liosa Merece la #ena en entornos de alta carga

mo&0web+it7 m5dulo #ara a#ac"e


-rgani1acin &e &irectorio#

webware/ Cache/ Configs/Application.config AppServer.config ErrorMsgs/ Logs/ Context1/ Context2/ . . Sessions/ AppServer AppServer.bat Launch.py !Service.py "eb#it.cgi $neShot.cgi

Cache de clasess, servlets, etc Configuracin de las aplicaciones instaladas Configuracin del servidor de aplicaciones Mensajes de error que se van generando Logs del servidor Contextos (pueden llamarse como se quiera)

Datos persistentes de las sesiones Script para lan ar el servidor de aplicaciones Lo mismo pero en !in"# Lan ador del servidor de aplicaciones Wrapper para instalar servicio en Win32 $daptador C%& $daptador C%& para depuracin

(ervlet#

;b4etos /ue se e4ecutan dentro de >eb8it Se cargan en memoria en la #rimera #etici5n Ms r#idos /ue los C,I )ueden mantener estado en el servidor de a#licaciones %/uivalentes a los servlets de B:%% Heredan de Web'it.(ervlet o de cual/uiera de sus descendientes

Web'it.2**P(ervlet Web'it.Page

Conte3to#

+os servlets se guardan en conte$tos Cn conte$to es un m5dulo )yt"on

Como cual/uier m5dulo contiene 00init00.py


Se e4ecuta antes /ue cual/uier servlet )uede #onerse a" c5digo de inicializaci5n Si contiene una 'unci5n conte3tInitiali1e entonces se llamar a conte3tInitiali1e4application/ path0o50conte3t6

+a con'iguraci5n de los conte$tos se guarda en Application.con5ig 0ota7 me4or #oner todos los m5dulos de accesorios 'uera de los conte$tos

2ello Worl&7

%4em#lo ms sim#le de servlet


fro% "eb#it.Servlet i%port Servlet class &ello"orl'(Servlet)* 'ef respon'(self+ trans)* trans.response().write(,&ello+ worl'-,)

)or de'ecto se genera te3t8html

Cmo #e e9ec!ta !n #ervlet

%l usuario "ace una #etici5n del ti#o7

"tt#7<<local"ost<-1<Conte$to<Servlet 0o es necesario indicar la e$tensi5n.

Se activa el conte$to FConte$toG y el servlet FServletG

Se reutiliza una instancia de FServletG del #ool de instancias9 o si el #ool est vaco se crea una nueva Se crea un ob4eto F*ransactionG Se e4ecutan en secuencia los mHtodos7

Servlet.a-a1e&transaction( Servlet.res#ond&transaction( Servlet.slee#&transaction(

Se devuelve la instancia de FServletG al #ool de instancias

!" contiene el ob9eto :*ran#action;

Cna transacci5n asocia los siguientes ob4etos

<e,!e#t7 #etici5n del cliente <e#pon#e7 res#uesta &cabeceras9 contenido( (ervlet (e##ion

Coo1ies )armetros en las url

Application7 controlador global

0o es "abitual traba4ar directamente con el ob4eto F*ransactionG

2ello Worl&7 =.2

;tro e4em#lo

from WebKit.Page import Page class HelloWorld(Page): def writeContent(self): self.writeln('Hello

world!')

Importante7 se "ereda de Web'it.Page

>#tr!ct!ra &e Web'it.Page

writeDocType() writeHeadParts() writeHTML() writeHead() writeStyleSheet()

writeTitle()

writeBody() writeBodyParts() writeContent()

Peticione#: 2**P<e,!e#t

Se deriva de la clase FRe/uestG %nca#sula la in'ormaci5n enviada #or el navegador

Cam#os ,%*<);S* .5iel&4name/ ?&e5a!lt@6 .ha#Aiel&4name6 .5iel&#46 Coo1ies7 .coo+ie4name/ ?&e5a!lt@6 .ha#Coo+ie4name6 .coo+ie#46 Cuando da lo mismo si es ,%*<);S*<Coo1ie se usa .val!e4name/ ?&e5a!lt@6 .ha#Bal!e4name6 .val!e#46 Se usa tambiHn #ara #asar variables a los C,I Rutas en el servidor ms cosas ...

<e#p!e#ta#: 2**P<e#pon#e

Se deriva de la clase FRes#onseG %nca#sula la in'ormaci5n /ue se devuelve al navegador

.writeln4te3t6 I enva te$to al navegador

)or de'ecto el te$to se acumula en un bu''er "asta /ue se termina de generar el contenido o se vaca e$#lcitamente

.#et2ea&er4name/ val!e6 I cambia<a3ade una cabecera .5l!#h46 I vacia los bu''ers y envia el contenido

Cuando se estn enviando 'ic"eros grandes Cuando se /uieren mostrar resultados #arciales

.#en&<e&irect4!rl6 I manda una cabecera F+ocation7G

%"to&o# Ctile# &e 2**P(ervlet

)ara acceder a la transacci5n y sus ob4etos

.tran#action46/ .repon#e46/ .re,!e#t46/ .#e##ion46/ . application46 .write46 I e/uivalent to .res#onse&(.-rite&( .writeln46 I adds a ne-line at t"e end .html>nco&e46 .!rl>nco&e46 .5orwar&46 .incl!&e)<D46 .call%etho&-5(ervlet46

)ara generar contenido


Ctilidades varias

Controlar el 'lu4o de la navegaci5n


Aorm!lario#

+os 'ormularios #ueden #rocesarse a mano consultando los valores .5iel&46 en writeContent46 o bien )ueden #rocesarse algo ms automticamente con los F ctionsG de >eb8it

socian di'erentes botones o acciones con mHtodos de un servlet C5digo ms lim#io y reutilizable /ue si se com#rueban uno #or uno los #armetros

Action#

Crear un bot5n en un 'ormulario mas o menos as

<input name=_action_add type=submit value=Add item>

Subclasificar un mtodo .actions()


def actions(self): ret"rn Page.actions() # $'add'%

El mtodo .respond() revisa los campos _action_ACCION donde ACCION debe corresponder con un mtodo devuelto por .actions() Si se encuentra un campo con el nombre adecuado se llamar! a handleAction(ACCION) en ve" de a writeHTML()

Aorwar&#

%s como una redirecci5n de la /ue ni el servidor -eb ni el cliente tienen constancia Se enca#sula un nuevo Re/uest en la transacci5n y se le #asa al nuevo servlet Cuando el servlet llamado termina se devuelve el control al servlet llamador9 #ero todo el contenido y las cabeceras del llamador son eliminadas )uede usarse #ara im#lementar validadores Se usa con #el5.5orwar&4E(ervletE6

(e#ione#: %antenien&o el e#ta&o

+as sesiones sirven #ara guardar datos entre #eticiones +as sesiones caducan des#uHs de un cierto tiem#o

)or de'ecto A@min9 aun/ue es con'igurable

Se #ro#orcionan los siguientes mHtodos

sel'.session&(.value&name J9 de'aultK( sel'.session&(."asLalue&name( sel'.session&(.values&( sel'.session&(.setLalue&name9 value(

FvalueG #uede ser cual/uier cosa ace#tada #or el m5dulo c)ic1le

(e#ione#: Fn&e #e g!ar&an

+a variable (e##ion(tore controla el com#ortamiento de la cac"H de sesiones

%emory7 las sesiones activas se mantienen todas en memoria Fynamic7 se establece un umbral de antigMedad #or encima del cual las sesiones se #asan a disco9 y en caso contrario se mantienen en memoria Aile7 #ara cada #etici5n la sesi5n se lee de disco y se guarda en disco

+as sesiones siem#re se guardan en disco cuando 'inaliza la e4ecuci5n del servidor de a#licaciones

I&enti5icacin &e la# #e#ione#


Cada sesi5n se identi'ica #or un identi'icador aleatorio )or de'ecto dic"o identi'icador se almacena en una coo1ie en el navegador Si se cambia )#eA!tomaticPath(e##ion# a N

%l identi'icador de sesi5n se #asa #or la CR+ Oa no se re/uiere ninguna coo1ie +as urls son ms com#le4as y susce#tibles de 'allos de seguridad

>eb8it #or a"ora no #uede determinar cul es el me4or sistema #ara mantener la sesi5n

P(P: Python (erver Page#

lgunas caractersticas de )S)

Sinta$is ins#irada en BS) .asado en )yt"on cceso al )I de >eb8it Dle$ible )S) .ase Class 'rame-or1 Se #ueden a3adir mHtodos a las clases generadas #or )S) Se com#ila una clase derivada de >eb8it.)age )or de'ecto se incluye todo el contenido en el mHtodo write2*%D46

Cuando se "ace una #etici5n a un )S)7


%arca# P(P

GHI e3pr HJ

Im#rime el resultado en el H*M+

GH blo,!e0&e0c&igo HJ

.lo/ue de c5digo a e4ecutar en el conte$to del servlet Cuidado es#ecial con los es#acios y tabuladores

Firectiva# P(P

GHK page import#I;mo&!lo#;HJ

+ista de m5dulos a im#ortar

GHK page e3ten&#I;Cla#eLa#e;HJ

Clase de la /ue "ereda la #gina

GHK page metho&I;meto&o; HJ

MHtodo del servlet donde se generar el H*M+. )or de'ecto ser write2*%D46

GHK page in&ent*ypeI;tab#8#pace#8brace#; HJ

*i#o de indentaci5n del servlet 'inal

Firectiva# P(P

GHK incl!&e 5ileI:myincl!&e.p#p;HJ

Incluye un 'ic"ero en tiem#o de com#ilaci5n. Se #arsea como )S) Si el 'ic"ero cambia durante la e4ecuci5n no se vern los cambios %/uivalente #el5.incl!&e)<D4Emyincl!&eE6 Se carga el 'ic"ero en cada #etici5n Se lee de disco sin #arsear )S) Se lee de disco en cada #etici5n Se incluye el 'ic"ero tal cual en tiem#o de com#ilaci5n9 sin #arsear )S) Solo se lee el 'ic"ero una vez en la com#ilaci5n

Gp#p:incl!&e pathI:myincl!&e;J

Gp#p:in#ert 5ileI:myincl!&e.html;J

Gp#p:in#ert 5ileI:myincl!&e.html; #taticI;1;J

Llo,!e# &e c&igo en P(P

.lo/ues automticos

GH 'or i in range&N@(7 HJ de'ine automticamente un blo/ue /ue termina con GH end HJ

.lo/ues manuales
GH 'or i in range&N@(7 4 P i MHJ de'ine automticamente un blo/ue /ue indenta al mismo nive /ue la siguiente instrucci5n del bucle y termina con cual/uier tag GH HJ &#.e4. GH #ass HJ(

+laves

Se #ueden em#lear llaves N O #ara la indentaci5n y eliminar ambigMedades debidas al 'ormateo del H*M+

*a#+'it

Dacilita la e4ecuci5n de tareas #eriodicamente

*areas de lim#ieza tem#oral Creaci5n de contenido semiesttico

Clases

*as18it.*as1 *as18it.Sc"eduler

Cheetah
QRuH tenemosS

(ervlet7 %structura de Clases #ara generar datos dinmicos9 y generar la salida Fen c5digoG. P(P7 )ginas H*M+ con )yt"on em#otrado #ara generar #ginas dinmicas.

QRue #roblemas daS

(ervlet7 C5digo de salida FH*M+G a 'uego en el c5digo. P(P7 )uede conducir a e$ceso de c5digo en las #ginas.

Q;tra o#ci5nS

,enerar mediante Servlet la in'ormaci5n dinmica. Ctilizar #lantillas #ara generar la salida.

!" o5rece Cheetah$

Mayor se#araci5n C5digo<)resentaci5n. %structura de )lantillas &)ginas H*M+( con un sublengua4e de acceso a datos en )yt"on. )uede utilizarse integrado en >eb>are y como m5dulo inde#endiente. +engua4e Dcil de a#render. Sistema vanzado de Cac"H. dmite divisi5n 4err/uica de las #lantillas.

Cheetah: Cmo A!nciona$

%structura de las #ginas en dos #artes7

)arte dinmica en Servlet7

Realiza las o#eraciones /ue desee &acceso a .ase de !atos9 identi'icaci5n del usuario ...(. ,uardar los datos /ue a'ectan a la #resentaci5n &usuario9 t"eme elegido9 ...( en variables de comunicaci5n con la #lantilla. !evolver como salida la a#licaci5n de la #lantilla. C5digo H*M+ con #arte dinmica /ue utilizan dic"as variables #ara generarse.

)arte de )resentaci5n en un 'ic"ero e$terno .tm#l

Cheetah* E.e%plo

Hello.p&

from WebKit.Page import Page from C'eeta'.(emplate import (emplate class Hello(Page): def ))init))(self): Page.))init))(self) self.template * (emplate(file*'(emplates+'ello.tmpl') def writeContent(self): "ser.self.re,"est.field('"ser' 'anon&mo"s') self.template."ser * "ser self.writeln(self.template)

2ello.tmpl

Hello.tm#l
-'tml. -'ead. -title./ienvenido 0"ser-+title. -+'ead. -bod&. -'1./ienvenido -+bod&. -+'tml. 0"ser a esta primera pr"eba-+'1.

Cheetah: I&enti5ica&ore# &e Plantilla

+os identi'icadores /ue em#iezan #or T son variables9 se sustituyen dmite condionales Ui' ... Uend i'. dmite bucles U'or9U'oreac" y U-"ile dmite encadenar #lantillas dentro de otras

Uinclude #ara incluir #lantillas Uinclude ra- #ara incluir 'ic"eros sin analizar

dmite bucles U'oreac"

Cheetah: >9emplo# &e Plantilla#

/"cle if
'4r"g"a&' 'Per"' 'Colombia' 'Costa 5ica'

2if 0co"ntr& in ('3rgentina' '6ene7"ela' '8e9ico') -H1.Hola 2else -H1.He& 2end if

senorita!-+H1.

bab&!-+H1.

5ecorrido de "n vector

-(3/:;. 2for 0client in 0service.clients -(5. -(<.0client.s"rname 0client.firstname-+(<.

-(<.-3 H5;=*>mailto:0client.email> .0client.email-+3.-+(<. -+(5. 2end for -+(3/:;.

Cheetah: >9emplo# &e Plantilla#

3cceso a "n diccionario

-P5;. 2for 0?e& 0val"e in 0dict.items()

0?e&: 0val"e 2end for -+P5;.

3cceso a valores de "n diccionario

nombre: 0"ser$'name'% 3pellidos: 0"ser$'apellidos'%

@
nombre: 0"ser.name 3pellidos: 0"ser.apellidos

Cheetah: Cache

C"eeta" admite un sistema de cac"H muy avanzado. s9 mientras se mantenga las mismas variables de interacci5n devolvera la misma cac"H. Se #uede guardar en cac"H regiones de 'ic"eros mediante Pcache .... Pen& cache +as cac"Hs se #ueden guardar mientras se cum#la una condici5n o durante un tiem#o establecido. Se #uede asignar un identi'icador a un regi5n cac"H &#or usuario9 #or e4em#lo(9 #ara discriminar.

Cheetah: >9emplo &e !#o &e Cach"


2cac'e Parte estAtica 0a 0b 0c 2end cac'e no serA refrescado

2cac'e timer*'3Bm'

id*'cac'e1'

2C 3ct"ali7ado cada media 'ora C2 2for 0c"st in 0c"stomer 0c"st.name: 0c"st.street D 0c"st.cit& 2end for 2end cac'e

2cac'e id*'sidebar'

test*(0is</4pdated or 0someEt'erCondition)

2C3ct"ali7ado mientras no se modifi,"e la /ase de <atos C2 ... left sidebar H(8: ... 2end cac'e

Cheetah: )#o &e#&e WebWare


Hay varios modos de utilizarlo7

Ctilizando el template dentro del Servlet

%n este caso el servlet no es una #lantilla9 sino /ue lo crea y le #asa los #armetros indicados.
template ' (emplate(file')ca*ecera+tmpl)) print (template)

Haciendo /ue el Servlet "erede de la clase Servlet de Cheetah.Servlet


from Cheetah+Servlet import Servlet class ,ello(Servlet)+ +

Cheetah: compilan&o la# pQgina#

C"eeta" #ermite com#ilar las #ginas7

!e esta 'orma se #ermite generar automticamente #or un tmpl el c5digo .py /ue genera la misma salida. c"eeta" com#ile <'ic"ero.tm#l>

s9 sim#lemente "aciendo un im#ort de dic"a clase se generara la salida. *ambiHn se #uede generar las #lantillas .tm#l a un 'ic"ero esttico H*M+.

c"eeta" 'ill <'ic"ero.tm#l>

<e5erencia#

)gina #rinci#al del #royecto >eb-are

"tt#7<<-eb-are.source'orge.net

!ocumentaci5n introductoria

"tt#7<<-eb-are.source'orge.net<)a#ers<

>i1i del #royecto

"tt#7<<-eb-are.source'orge.net<>i1i<

Motor de #lantillas &e$terno a >eb-are(

"tt#7<<---.c"eeta"tem#late.org<

Lalidador automtico de 'ormularios &e$terno a >eb-are(

"tt#7<<'un'orm1it.source'orge.net<

>-C: >n& o5 Charla

Q)reguntasS

Vous aimerez peut-être aussi