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:
- 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óduloos
, que provee un diccionario de las peticiones HTTP estándar y otras variables de entorno, y la funciónstart_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".
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.