Welcome to Scribd, the world's digital library. Read, publish, and share books and documents. See more
Download
Standard view
Full view
of .
Look up keyword
Like this
2Activity
0 of .
Results for:
No results containing your search query
P. 1
Pensando en Python (III)

Pensando en Python (III)

Ratings: (0)|Views: 95 |Likes:
Published by Aprender Libre
En esta tercera entrega de la serie sobre Python aprenderemos a realizar
aplicaciones web que acceden a bases de datos. Ilustraremos cómo Python representa una seria opción para el desarrollo de aplicaciones web mediante la extensión de la aplicación de tres en raya desarrollada en las dos entregas anteriores.
En esta tercera entrega de la serie sobre Python aprenderemos a realizar
aplicaciones web que acceden a bases de datos. Ilustraremos cómo Python representa una seria opción para el desarrollo de aplicaciones web mediante la extensión de la aplicación de tres en raya desarrollada en las dos entregas anteriores.

More info:

Published by: Aprender Libre on Jun 30, 2012
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

02/01/2013

pdf

text

original

 
SOLO PROGRAMADORES nº 120
Introducción
Dada la popularidad de Internet, el desarrollo de apli-caciones con interfaz web, agnósticas de la platafor-ma donde se ejecute el cliente web (navegador), haexperimentado un crecimiento exponencial. A pesarde la menor sofisticación de las interfaces web res-pecto a las interfaces gráficas de aplicaciones desobremesa, su facilidad tanto de uso, dada la familia-ridad de los usuarios con el paradigma web, como susimplicidad de desarrollo, son razones suficientespara considerarlas como primera opción en cualquierdesarrollo que una empresa acomete hoy en día.En las aplicaciones web, una sola instancia de lamisma ejecutándose en un servidor web (o varias enun cluster de servidores), es compartida por varios (enalgunos casos cientos o miles) de usuarios que acce-den a ella desde un cliente universal, el navegador deInternet. El principal cometido de una aplicación webes crear páginas HTML (o en cualquier otro lenguajede marcado) de manera dinámica. Es decir, los datosestáticos predefinidos de una página son combinadoscon datos generados por la lógica de la aplicación uobtenidos de fuentes de datos en tiempo real, porejemplo de una base de datos. Durante la ejecuciónconcurrente de las tareas requeridas simultáneamen-te por los diferentes usuarios de la aplicación web esfrecuente que se detecten conflictos de acceso ymodificación a datos en el servidor. Además, la aplica-ción web debe generar las páginas web, ejecutandotoda la lógica de negocio subyacente, de la maneramás rápida y eficiente posible. Es por tanto necesario,adoptar mecanismos en la parte servidora que agili-cen los accesos a datos y soporten transacciones, esdecir, conjuntos de operaciones físicas relacionadassobre datos, que aparecen al cliente como una unidadlógica. Entran en juego aquí los llamados sistemasgestores de bases de datos (SGBD). La versión máscomúnmente utilizada de los mismos son los sistemasrelaciones de bases de datos. En definitiva, servidoresweb y bases de datos relacionales conforman un bino-mio esencial en la creación de toda aplicación web.A continuación, explicaremos cómo se puedencrear aplicaciones web en Python que acceden abases de datos relacionales. Como resultado deeste proceso transformaremos la aplicación desobremesa tres en raya desarrollada durante lasdos anteriores entregas en una aplicación web.
Programaci
ó
n web en Python
Al tratarse Python de un lenguaje de c
ó
digo abiertoexisten multitud de m
ó
dulos/librer
í
as para realizarcualquier tarea program
á
tica que imaginemos. Enocasiones, como es el caso de la programaci
ó
n web,existen varios m
ó
dulos diferentes que de una mane-ra m
á
s b
á
sica o sofisticada nos permiten llevar a cabola misma tarea. Para comprobarlo no tenemos m
á
sque visitar el portal de Python, en su secci
ó
n deTemas/web (http://www.python.org/topics/web/). All
í
podemos encontrar un largo listado de estos m
ó
du-los, detallando sus diferentes funciones. A continua-ci
ó
n enumeramos los m
á
s destacados, clasificadosseg
ú
n la categor
í
a de plataforma de desarrollo deaplicaci
ó
n web a la que pertenecen:
Programaci
ó
n CGI B
á
sica:
M
ó
dulo CGI de la librer
í
a Standard dePython. CGI (Common Gateway Inteface) esun mecanismo est
á
ndar para la ejecuci
ó
n dec
ó
digo ejecutable por un servidor web y laobtenci
ó
n de los resultados de tal ejecuci
ó
n.
M
ó
dulo Cookie para la creaci
ó
n y procesa-miento de cookies en aplicaciones web. Unacookie es un mecanismo para mantener esta-do entre las peticiones HTTP de una sesi
ó
nweb. Una cookie es una cabecera HTTP quepermite la identificaci
ó
n un
í
voca en el servi-dor web del peticionario de la informaci
ó
n.
Programaci
ó
n CGI Avanzada.
En CGI, un nuevoproceso es creado por cada petici
ó
n HTTP recibi-da y eliminado cuando la petici
ó
n es resuelta. Laeficiencia es pobre. Esta es la raz
ó
n por la que han
22
MIDDLEWARE
Pensando en Python (III):3 en raya en la webPensando en Python (III):3 en raya en la web
En esta tercera entrega de la seriesobre Python aprenderemos a realizar aplicaciones web que acceden a bases de datos. Ilustraremos cómoPython representa una seria opción para el desarrollo de aplicacionesweb mediante la extensión de laaplicación de tres en rayadesarrollada en las dos entregasanteriores.
DIEGO LZ.DE IPIÑA GZ.DE ARTAZA (profesor del departa-mento de Ingeniería del Software de la facultad deIngeniería (ESIDE) de la Universidad de Deusto)
Crearemos unaaplicación webque accederá auna base de datos
 
SOLO PROGRAMADORES nº 120
aparecido numerosas tecnolog
í
as que per-miten una integraci
ó
n superior con el servi-dor web subyacente, y lo m
á
s importante,una mayor eficiencia. Ejemplos claros deestas tecnolog
í
as son PHP, Java Servlets yJSPs, y ASPs. En el caso particular dePython, la contribuci
ó
n m
á
s interesante aeste respecto es mod_python:
mod_python es un m
ó
dulo Apache queintegra el int
é
rprete Python dentro delservidor, de modo que las aplicacionespueden ejecutarse de manera m
á
s r
á
pidaque CGI, retiene datos persistentes entrelas peticiones HTTP de una sesi
ó
n y per-mite acceder a la parte interna de Apache.
Servidores de aplicaciones.
 Van m
á
s all
á
de la simple generaci
ó
n de p
á
ginas din
á
mi-cas y asisten al programador en otras tareasde la programaci
ó
n de la l
ó
gica de negocio,tales como la persistencia de datos, la ges-ti
ó
n de transacciones o la seguridad:
Webware facilita una suite de compo-nentes Python para el desarrollo de apli-caciones web. Provee un servidor de apli-caciones, servlets, Python Server Pages(PSP), mapeo de objetos a bases de datosrelacional y organizador de tareas. Laarquitectura es muy modular, y permitea
ñ
adir tus propias extensiones.
Zope, el Z Object Publishing Environment,proporciona una ORB (Object RequestBroker) HTTP que permite publicar e invo-car objetos Python en la web sin necesi-dad de ning
ú
n tipo de c
ó
digo CGI o HTTPespec
í
fico. Objetos complicados puedenser publicados con URLs que simulan jerarqu
í
as de objetos. Zope proporcionavarios componentes que pueden usarseen concierto o separadamente. Algunoscomponentes incluidos son: un paquetede plantillas HTML, un sistema de persis-tencia de objetos, una plataforma para lagesti
ó
n de objetos v
í
a web, e incluso unservidor web sencillo.En este art
í
culo nos concentraremos en elm
ó
dulo mod_python, que a juicio del autorrepresenta la manera m
á
s sencilla y eficiente deimplementar aplicaciones web en Python. Losservidores de aplicaciones como Zope repre-sentan una clara alternativa, y aunque tambi
é
ntienen un rendimiento tan elevado o superior amod_python, su uso no es trivial y requerir
í
ansu exposici
ó
n mucho m
á
s detallada.
Integraci
ó
n Apache/Python:mod_python
Grisha Trubetskoy (http://www.ispol.com/home/grisha/) cre
ó
mod_python en 2003 con elprop
ó
sito de ofrecer un m
ó
dulo de extensi
ó
n parael servidor web Apache (www.apache.org) quepermitiese la generaci
ó
n de p
á
ginas din
á
micascon Python de una manera m
á
s eficiente que eltradicional m
ó
dulo CGI. mod_python empotra elint
é
rprete de Python dentro del servidor Apache.Con mod_python puedes escribir aplicacionesweb en Python que ejecutan muchas veces m
á
sr
á
pido que los CGIs tradicionales, tienen acceso acaracter
í
sticas avanzadas tales como retenerconexiones a bases de datos entre conexionesHTTP y permiten acceder a la parte interna deApache. Con mod_python, el c
ó
digo Python seejecuta directamente dentro del servidor Apache,sin necesidad de que
é
ste tenga que lanzar proce-sos externos o delegar las peticiones a servidoresde aplicaciones externos. mod_python se benefi-cia de las habilidades de Apache para aceptar yprocesar peticiones entrantes de una maneraescalable a la carga. El resultado es una platafor-ma que, seg
ú
n Trubetskoy, puede procesar peticio-nes m
á
s r
á
pido que cualquier otra plataforma dedesarrollo web en Python. mod_python es:
Un m
ó
dulo Apache recargable que empotrael int
é
rprete de Python (libpython) prove-yendo la habilidad de ejecutar c
ó
digoPython en el mismo proceso que Apache.
Un manejador de las fases de procesamien-to de las peticiones HTTP en Apache, que per-mite implementar cualquier fase en Python.Tambi
é
n permite implementar filtros ymanejadores de conexiones en Python. Unfiltro HTTP intercepta de manera din
á
micapeticiones y respuestas para transformar ousar la informaci
ó
n contenida en las mismas.
Una interfaz a un subconjunto de las APIsde Apache, permitiendo la invocaci
ó
n defunciones internas del servidor desdePython. Esto permite acceder a informa-ci
ó
n interna del servidor o de beneficiarsede facilidades del mismo como logeo.
Una colecci
ó
n de herramientas para eldesarrollo de aplicaciones web. Provee unconjunto de manejadores de peticiones:Publisher (mapea URLs a objetos y funcio-nes dentro de m
ó
dulos Python), PSP (per-mite la creaci
ó
n de Python Server Pages) yCGI (permite la programaci
ó
n web confor-mando con el est
á
ndar CGI). Cada uno deestos manejadores ofrece una maneradiferente de desarrollar aplicaciones web,as
í
como un conjunto de objetos y funcio-nes de utilidad para el procesamiento decookies, gesti
ó
n de sesiones, y otros aspec-tos comunes en el desarrollo web.El mayor incoveniente de mod_python es ser espe-c
í
fico a Apache, a diferencia de JSPs y PHP quepueden integrarse con diferentes servidores web.
23
MIDDLEWARE
Pensando en Python (III): 3 en raya en la web
LISTADO 2
Código del fichero holasolop.psp
<html><%if form.has_key(
nombre
): # el objeto form es descrito en la siguiente secci
ó
nsaludo =
‘¡
Hola, %s!
% form[
nombre
].capitalize()else:saludo =
Hola solop!
# end%><h1><%= saludo %></h1></html>
LISTADO 1
Hay que incluir este código XML en el fichero httpd.conf
<Directory
<directorio-instalaci
ó
n-apache>/cgi-bin/python
>SetHandler mod_pythonPythonHandler mod_python.publisherPythonDebug On</Directory><Directory
<directorio-instalaci
ó
n-apache>/cgi-bin/psp
>AddHandler mod_python .pspPythonHandler mod_python.pspPythonDebug On</Directory>
LISTADO 3
Página de partida (index.html) de la aplicación web Tres en Raya
<html><head><meta name=
description
content=
””
><meta name=
keywords
content=
””
><title>Juego Tres en raya para Solop</title></head><frameset cols=
100%
border=
0
><frame src=
/cgi-bin/psp/tresenraya.psp
name=
tresenraya
></frameset></html>
 
SOLO PROGRAMADORES nº 120
Instalando Apache y mod_python
Para poder instalar mod_python es requisitoimprescindible la previa instalaci
ó
n delint
é
rprete de Python y el servidor webApache. Detalles sobre c
ó
mo instalar Pythontanto en Windows como UNIX fueroncubiertos en la primera entrega deesta serie.Apache ha sido el servidor m
á
s popularen Internet desde 1996. En Octubre del2003, 64% de los servidores web enInternet usaban Apache. Para obtener la
ú
ltima versi
ó
n de Apache es necesarioacceder a su p
á
gina web: http://httpd.apache.org/. La mayor
í
a de lasdistribuciones Linux ya traen preinstala-do este servidor bien en su versi
ó
n 1.3 o2.0 (la
ú
ltima y la que utilizaremos eneste art
í
culo). Alternativamente, serecomienda que utilices tu gestor depaquetes Linux favorito para conseguiruna copia o b
á
 jate el c
ó
digo fuente dehttp://httpd.apache.org/download.cgi ysigue las instrucciones de compilaci
ó
nincluidas. Si eres un usuario deWindows b
á
 jate el fichero de instala-ci
ó
n apache_2.xxx-win32-x86-xxx.msiy haz doble clic sobre
é
l (el CD-ROMadjunto incluye la versi
ó
n de Apachepara Windows).mod_python puede obtenerse dehttp://httpd.apache.org/modules/python-download.cgi. Los usuarios deWindows deben ejecutar el fichero.exe suministrado que instalar
á
mod_python en su sistema. Los usua-rios de UNIX pueden bajarse el c
ó
digofuente y las instrucciones de compila-ci
ó
n del mismo lugar. En la prepara-ci
ó
n de este art
í
culo hemos usado laversi
ó
n 3.0 de mod_python (el CD-ROM adjunto incluye la versi
ó
n demod_python para Windows).
Configurando Apache ymod_python
Una vez instalado Apache ymod_python tan s
ó
lo resta modificarel principal fichero de configuraci
ó
nde Apache, ubicado en <directorio-instalaci
ó
n-apache>/conf/httpd.conf:
1.-
Al final del bloque de sentenciasLoadModule a
ñ
adir la siguiente:
LoadModule python_module modules/mod_python.so
2.-
Despu
é
s del bloque XML iniciadopor el elemento Directory y corres-pondiente al directorio htdocs, direc-torio ra
í
z del que cuelgan, por defec-to, los documentos HTML est
á
ticos enApache, colocar los bloques Directorydel listado 1, reemplazando <directo-rio-instalaci
ó
n-apache> por la rutade instalaci
ó
n de Apache en tu m
á
quina.Con las definiciones mostradas en el lista-do 1 indicamos que debajo del subdirecto-
24
MIDDLEWARE
LISTADO 5
Código principal de web /cgi-bin/psp/tresenrayaweb.py
import tresenrayaNO_GANADOR = -1EMPATE = 0GANA_JUGADOR = 1PIERDE_JUGADOR = 2class JuegoTresEnRayaWeb(tresenraya.JuegoTresEnRaya):# falta el constructor y algunos m 
é
todos, mirar c
ó
digo completo en CD...def select_casilla(self, x, y):if not self.jugar(x, y):return self.ganadorelse:return NO_GANADORdef jugar(self, x, y):if self._JuegoTresEnRaya__casillasMarcadas < 9:if self._JuegoTresEnRaya__casillero[x][y] == None:self._JuegoTresEnRaya__casillero[x][y]=self._JuegoTresEnRaya__marcaJugadorself._JuegoTresEnRaya__casillasMarcadas += 1self.__marcarCasilla(x, y,
o.png
)if self._JuegoTresEnRaya__hayGanador():self._JuegoTresEnRaya__registro.registrarVictoria(self._JuegoTresEnRaya__nombreUsuario)self.ganador = GANA_JUGADORreturn Falseelif self._JuegoTresEnRaya__casillasMarcadas == 9:self._JuegoTresEnRaya__registro.registrarEmpate(self._JuegoTresEnRaya__nombreUsuario)self.ganador = EMPATEreturn FalsecasillaIndex = self._JuegoTresEnRaya__elegirMarcaMaquina()self._JuegoTresEnRaya__casillero[casillaIndex[0]][casillaIndex[1]] =self._JuegoTresEnRaya__marcaMaquinaself._JuegoTresEnRaya__casillasMarcadas += 1self.__marcarCasilla(casillaIndex[0], casillaIndex[1],
x.png
)if self._JuegoTresEnRaya__hayGanador():self._JuegoTresEnRaya__registro.registrarPerdida(self._JuegoTresEnRaya__nombreUsuario)self.ganador = PIERDE_JUGADORreturn Falseelif self._JuegoTresEnRaya__casillasMarcadas == 9:self._JuegoTresEnRaya__registro.registrarEmpate(self._JuegoTresEnRaya__nombreUsuario)self.ganador = EMPATEreturn Falsereturn True
LISTADO 4
Lógica de control de /cgi-bin/psp/tresenraya.psp
<%import tresenrayaweb# hay que hacer login antes de poder jugar, verificamos si se ha pasado un nombreUsuarioif not form.has_key(
nombreUsuario
):# solicitamos nombreUsuario en login.psppsp.redirect(
/cgi-bin/psp/login.psp
)else:saludo =
‘¡
Bienvenido %s a Tres en raya!
% form[
nombreUsuario
].capitalize()# end# se crea un objeto partida y se cachea en sesi
ó
nif not session.has_key(
partida
):session[
partida
] = tresenrayaweb.JuegoTresEnRayaWeb()# de momento no hay ganadorganador = tresenrayaweb.NO_GANADOR# si se pasan como par
á
metros las coordenadas x e y de una casilla,
é
sta se seleccionaif form.has_key(
x
) and form.has_key(
y
):ganador = session[
partida
].select_casilla(eval(form[
x
]), eval(form[
y
]))# continua en listado 5 ...

You're Reading a Free Preview

Download
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->