Aplicaciones Web sencillas con Python (1)

Este artículo está dedicado a aquellas personas que quieran dar sus primeros pasos en el desarrollo de aplicaciones web, y para aquellos que desarrollan aplicaciones sencillas, sin demasiadas complicaciones. Antes de redactar este artículo he estado probando y evaluando diversos frameworks para crear sitios web, tales como Bobo, Web2Py, CherryPy, Django, etc., pero al final me he decantado por WebPy, por su extrema sencillez para empezar, y por la similitud que tiene con otros frameworks de otros lenguajes, con lo que la curva de aprendizaje es óptima.

Más adelante, si los proyectos web se vuelven muy complejos y se requiere de elementos prefabricados y avanzados (como objetos persistentes a bases de datos, encriptación, modelo vista controlador, etc.), recomiendo utilizar los otros frameworks citados anteriormente (hay muchos más, pero éstos son más populares y potentes).

Se asume que el lector tiene conocimientos básicos de Python y que previamente tiene instalado el intérprete de Python en su máquina

Configuración del servidor Web
 
WebPy, a diferencia de otros frameworks, no posee un servidor de aplicaciones potente propio, y por ello, es mejor apoyarse en uno que ya esté funcionando. Entre los posibles candidatos se encuentran Apache, Lighttpd y nginx. Para este artículo he optado por Apache, dada su gran popularidad.

Una vez instalado Apache en nuestra máquina, es necesario agregar el módulo mod_wsgi, que permite hacer uso de Apache como servidor para aplicaciones escritas en Python. Este proyecto está alojado en http://code.google.com/p/modwsgi
 
Una vez descargado, si estamos usando Windows, renombrar el archivo a mod_wsgi.so y copiarlo al directorio modules de Apache. En el caso de Linux, compilar el módulo mod_wsgi (consultar: http://code.google.com/p/modwsgi/wiki/QuickInstallationGuide)
 
Una vez instalado el módulo, hay que configurar Apache para que reconozca dicho módulo. Para ello, editar el archivo httpd.conf (en el directorio conf de Apache), y agregar la siguiente línea en la misma parte en que Apache utiliza otras cargas LoadModule:
 
LoadModule wsgi_module modules/mod_wsgi.so
 
Al arrancar Apache desde la terminal debería dar un mensaje similar a éste:

Apache/2.2.2 (Unix) mod_wsgi/1.0 Python/2.3 configured
 
Si se lanzó desde Windows, el Apache Service Monitor, debería dar el mensaje en la parte inferior de la ventana.
 

Instalación de WebPy
 
Hay varias maneras de instalar WebPy (consultar http://webpy.org/download). Se puede descargar directamente la última versión desde la siguiente URL (consultar http://webpy.org/download para conocer cuál es la última versión):  http://webpy.org/static/web.py-0.34.tar.gz
 
También se puede descargar desde el repositorio en github: http://github.com/webpy/webpy

Una vez descargado, descomprimir el archivo tar.gz, y ejecutar la siguiente sentencia para instalarlo como librería en Python:
 
python setup.py install
 

Primera aplicación Web
 
Para ilustrar la sencillez de desarrollo de una página Web con WebPy, vamos a crear la típica aplicación “Hola, Mundo”.
 
import web
 
urls = (
   '/', 'index'
)
 
app = web.application(urls, globals())
 
class index:
   def GET(self):
      return "Hola, Mundo"

if __name__ == "__main__":
   app.run()
 
La variable urls es una tupla que contiene pares de direccionamientos URL y nombres de clase. En este ejemplo, el direccionamiento “/” (root), estará asociado a la clase index. Se pueden definir tantos pares como sean necesarios para la aplicación Web.
 
El objeto app contendrá la definición de la aplicación Web. En este ejemplo se asocian las URL’s de la aplicación a namespace global.
 
La clase index contiene un método GET, el cual se lanzará cuando se invoque a la página, pudiendo recibir parámetros. En su interior, retornará el literal “Hola, Mundo”, el cual se imprimirá en el navegador. Existe
también un método POST, que funciona como GET, pero ofuscando los parámetros. Estos dos métodos son los medios habituales de invocar a una página Web pasando (o no) parámetros.

Por último, las dos últimas líneas indican a WebPy que comience a servir páginas web con la configuración indicada.


Una vez se ejecuta este programa, el intérprete de Python se queda en modo de espera. El servicio Web está en marcha, esperando peticiones. Para probarlo, abrimos un navegador web e introducimos la URL: http://localhost:8080

Debería aparece nuestro bien conocido mensaje “Hola, Mundo”.


 
Parámetros y HTML
 
En una aplicación Web introduciremos elementos HTML para formatear el aspecto de las páginas. Además,  añadiremos dinamismo permitiendo que las páginas muestren datos parametrizados (por ejemplo, recogidos de un
formulario, o capturados de una base de datos).

Vamos a añadir más funcionalidad a nuestra aplicación anterior:

import web

urls = (
   '/hola', 'Saludo'
)
 
app = web.application(urls, globals())
 
class Saludo:
   def GET(self):
      data = web.input()
      return """
      <html>
      <head></head>
      <body background='#AAAAFF'>
      <h1>Hola, %s %s %s</h1>
      </body>
      </html>""" % (data.nombre, data.apellido1, data.apellido2)
 
if __name__ == "__main__":
   app.run()
 
El primer cambio lo hemos realizado en la sección de urls, donde ahora, el mapeo a la página Web será el siguiente:
http://localhost:8080/hola
 
Cuando se apunta a /hola, se invocará a la clase Saludo, concretamente a su método GET, en donde hemos agregado varios cambios. El primero de ellos ha sido definir una variable data, la cual recogerá los parámetros que se pasen por URL, lo que se consigue mediante la función input() del módulo web. Estos parámetros se recogerán en formato de diccionario, y son pares de parámetro y valor.

A la hora de retornar la salida, se retornará HTML, en donde hemos añadido un mensaje con formato de título (<h1>), un saludo con nombre y apellidos (extraídos de los parámetros pasados), los cuales se formatean mediante %s, e indicando después qué parámetros extraer.
 
Para invocar a la nueva página se pasan los parámetros en la misma URL, tal y como haría una llamada desde un formulario: http://localhost:8080/hola?nombre=Carmen&apellido1=Martinez&apellido2=Salguero