Home > Python > Corriendo python bajo apache

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.

¿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:

Destinada al almacenaje de nuestra aplicación Python pura (será un directorio privado, no servido).
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:

Deberá llamarse application
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:

Habilitamos el sitio web: sudo a2ensite python-web
Recargamos Apache: sudo service apache2 reload
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”.