Ver índice de contenidos del libro

13.3. Utilizando environ para manejar peticiones del usuario

El diccionario environ del módulo os, nos provee de la URI solicitada por el usuario, a través de la clave REQUEST_URI. Valiéndonos de ella, podremos crear una Application WSGI Controller mucho más potente, que nos permita hacer switch de la petición, para saber a qué módulo llamar.

Para ello y a fin de poder manejar imports absolutos evitando inconvenientes, primero debemos crear un archivo __init__.py en mypythonapp y luego, agregar el path de nuestra aplicación en nuestro controller.py, para que Python busque allí nuestros módulos:

from sys import path
path.append('/home/yo/curso-python/trunk/python-web/')

Ahora, todos nuestros imports los podremos hacer con el namespace absoluto, desde mypythonapp. Por ejemplo:

from mypythonapp.mi_paquete import mi_modulo

Nuestra app, podría por ejemplo, tener un paquete llamado sitioweb. Dentro de este paquete, podría tener varios módulos, correspondientes a cada una de las secciones de nuestro sitio. Valiéndonos de la clave REQUEST_URI de environ, podríamos hacer un switch como el que sigue:

from sys import path 
path.append('/home/eugenia/borrador/python-web/') 
 
from mypythonapp.sitioweb import contacto, default 
 
def application(environ, start_response): 
    peticion = environ['REQUEST_URI'] 
 
    if peticion.startswith('/contacto'): 
        output = contacto.formulario() 
    elif peticion.startswith('/gracias'): 
        output = contacto.gracias() 
    else: 
        output = default.default_page() 
 
    start_response('200 OK', [('Content-Type', 'text/html; charset=utf-8')]) 
    return output

Nota Importante: siempre, tras hacer un cambio a tu aplicación, debes reiniciar Apache para que los cambios se vean reflejados de manera correcta: sudo service apache2 restart

Al ingresar a http://python-app/contacto, el contenido mostrado será el retornado por la función formulario() del módulo contacto del paquete sitioweb.

Si en cambio, ingresáramos en http://python-app/gracias, veríamos el contenido retornado por la función gracias() del mismo módulo.

Y si la URI solicitada no fuese ni una ni otra, siempre se mostrará el contenido retornado por la función default_page() del módulo default del paquete sitioweb.

Nota Ten en cuenta que ningún print de tu app será tenido en cuenta. Todas las funciones de tu app, tendrán que hacer un return del contenido que desees mostrar al usuario, para que el Application WSGI Controller, se encargue de entregarlos a WSGI y éste, de mostrarlos al usuario.

Copyright (c) 2011-2013 Eugenia Bahit. La copia y redistribución de esta página se permite bajo los términos de la licencia Creative Commons Atribución NoComercial SinDerivadas 3.0 Unported siempre que se conserve esta nota de copyright.