Ver índice de contenidos del libro

13.2. Python bajo Apache

Como si de una receta de cocina se tratara, vamos a aprender cómo servir aplicaciones Web con Python, utilizando el servidor Apache.

No es mucha la bibliografía que puede encontrarse al respecto, pero sí, lo es bastante confusa y hasta incluso contradictoria. Por eso, en este curso, nos vamos a proponer mantener el espíritu de simplicidad de Python, encontrando la manera simple de hacerlo.

13.2.1. ¿Qué necesitamos?

En principio, necesitamos hacer que Apache, incorpore un soporte para servir archivos Python. Para ello, necesitaremos habilitarle un módulo, que brinde este soporte.

Existen varios módulos de Apache que brindan soporte para correr archivos Python. Uno de los más populares es el módulo mod_python, que sin embargo, presenta algunos problemas que pueden prevenirse, utilizando el módulo mod_wsgi el cual utilizaremos en este curso.

1) Instalación de mod_wsgi en Apache

Para habilitar mod_wsgi en Apache, basta con instalar el paquete libapache2-mod-wsgi:

sudo apt-get install libapache2-mod-wsgi

2) Crear la estructura de directorios para nuestra aplicación

Primero, es importante saber, como va a funcionar nuestra aplicación y cómo va a interactuar vía Web.

Debemos tener un directorio destinado a montar toda la aplicación:

mkdir /home/yo/curso-python/trunk/python-web

Dentro de este directorio, vamos a dividir su arquitectura en dos partes:

  1. Destinada al almacenaje de nuestra aplicación Python pura (será un directorio privado, no servido).
  2. Destinada a servir la aplicación (directorio público servido) en el cuál solo almacenaremos archivos estáticos.
mkdir /home/yo/curso-python/trunk/python-web/mypythonapp
mkdir /home/yo/curso-python/trunk/python-web/public_html

Dentro de nuestro directorio mypythonapp, almacenaremos entonces, todos los módulos y paquetes de nuestra aplicación Python, mientras que en public_html, estarán todos los archivos estáticos y será el único directorio al que se pueda acceder mediante el navegador Web.

Aprovecharemos este paso, para crear una carpeta, destinada a almacenar los logs de errores y accesos a nuestra Web App:

mkdir /home/yo/curso-python/trunk/python-web/logs

3) Crear un controlador para la aplicación

Todas las peticiones realizadas por el usuario (es decir, las URI a las cuáles el usuario acceda por el navegador), serán manejadas por un único archivo, que estará almacenado en nuestro directorio mypythonapp.

echo '# -*- coding: utf-8 -*-' > mypythonapp/controller.py

Este archivo controller.py actuará como un pseudo front controller, siendo el encargado de manejar todas las peticiones del usuario, haciendo la llamada a los módulos correspondientes según la URI solicitada.

Dicho módulo, solo se encargará de definir una función, que actúe con cada petición del usuario. Esta función, deberá ser una función WSGI aplicación válida. Esto significa que:

  1. Deberá llamarse application
  2. Deberá recibir dos parámetros: environ, del módulo os, que provee un diccionario de las peticiones HTTP estándar y otras variables de entorno, y la función start_response, de WSGI, encargada de entregar la respuesta HTTP al usuario.
def application(environ, start_response): 
    # Genero la salida HTML a mostrar al usuario 
    output = "<p>Bienvenido a mi <b>PythonApp</b>!!!</p>" 
    # Inicio una respuesta al navegador 
    start_response('200 OK', [('Content-Type', 'text/html; charset=utf-8')]) 
    # Retorno el contenido HTML 
    return output

Más adelante, veremos como crear un Application WSGI Controller, mucho más potente.

4) Configurar el VirtualHost

En la buena configuración de nuestro VirtualHost, estará la clave para correr nuestra aplicación Python a través de la Web.

Mientras que el DocumentRoot de nuestro sitio Web, será la carpeta pública, public_html, una variable del VirtualHost, será la encargada de redirigir todas las peticiones públicas del usuario, hacia nuestro front controller. Y la variable que se encargue de esto, será el alias WSGIScriptAlias:

sudo nano /etc/apache2/sites-available/python-web

Una vez allí, escribimos el contenido del nuevo virtual host:

<VirtualHost *:80> 
  ServerName python-web
 
  DocumentRoot /home/yo/curso-python/trunk/python-web/public_html 
  WSGIScriptAlias / /home/yo/curso-python/trunk/python-web/mypythonapp/controller.py 
  ErrorLog /home/yo/curso-python/trunk/python-web/logs/errors.log 
  CustomLog /home/yo/curso-python/trunk/python-web/logs/access.log combined 
 
  <Directory /> 
    Options FollowSymLinks 
    AllowOverride All 
  </Directory> 
</VirtualHost>

Una vez configurado nuestro VirtualHost:

  1. Habilitamos el sitio web: sudo a2ensite python-web
  2. Recargamos Apache: sudo service apache2 reload
  3. Habilitamos el sitio en nuestro host: sudo nano /etc/hosts y allí agregamos la siguiente línea: 127.0.0.1python-web

A partir de ahora, si abrimos nuestro navegador Web e ingresamos la url http://python-web veremos la frase: "Bienvenido a mi PythonApp".

Nota Agregar un nuevo hostname a nuestro /etc/hosts nos permitirá seguir trabajando normalmente con nuestro localhost, sin que nuestras aplicaciones Python interfieran con otras, ya sean webs estáticas en HTML o dinámicas en PHP u otro lenguaje.

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.