====== Django con Apache y mod_python ======
Algunas notas sobre la configuración de [[http://httpd.apache.org/docs/|Apache]] para poder usar [[http://www.djangoproject.com/|Django]], en particular para permitir la [[instalacion_de_catalis_con_django|instalación de Catalis]].
Estas son notas preliminares que pretenden documentar lo que he estado aprendiendo, y orientar a quienes hagan pruebas de instalación de Catalis. No deben considerarse notas para un //usuario final// de Catalis.
===== Tres servidores... o uno que vale por tres =====
Empecemos por aclarar para qué necesitamos un servidor web (o varios) al usar Catalis con Django:
- Para servir **contenido dinámico** generado por Django.
- Para servir **archivos estáticos** ("media", en la jerga de Django): css, js, imágenes, xml, html estático, etc. Esto incluye los archivos propios de Catalis, los de [[http://extjs.com/products/extjs/|Ext JS]], y los que usa Django para la interfaz administrativa.
- Para acceder a las **bases ISIS** vía [[http://bvsmodelo.bvsalud.org/php/level.php?lang=es&component=28&item=2|wxis]] (un ejecutable cgi).
Esta situación puede dar lugar a diversas configuraciones, desde usar un servidor separado para cada una de las tres funciones, hasta usar uno solo, pasando por combinaciones intermedias. En la práctica, parecería que lo más sencillo y conveniente será **manejar las tres funciones desde un único servidor**, como veremos en el ejemplo de más abajo.
Veamos ahora algunas observaciones particulares.
=== Contenido dinámico ===
El ítem **1** es el único que requiere que Apache use el módulo **mod_python**. La documentación oficial de Django sobre esta cuestión puede verse en [[http://www.djangoproject.com/documentation/modpython/|How to use Django with mod_python]].
(**TO-DO:** incluir alguna información mínima sobre cómo instalar/activar mod_python; p.ej. en Ubuntu se instala ''libapache2-mod-python'').
=== Archivos estáticos ===
Para el ítem **2** podemos usar el mismo servidor (o host virtual) que el usado para el ítem **1**, aunque también podríamos usar un servidor (o host virtual) separado. Según lo que decidamos, habrá que ajustar las variables correspondientes en el archivo ''settings.py'' asociado a Catalis.
La documentación oficial de Django nos da una guía para configurar Apache apropiadamente en este aspecto: [[http://www.djangoproject.com/documentation/modpython/#serving-media-files|Serving media files]].
=== Bases ISIS ===
El ítem **3** requiere una atención particular. A diferencia de los otros dos ítems, aquí no se trata de atender peticiones "externas" ---esto es, desde un browser--- sino peticiones "internas", hechas desde el código Python (pywxis.py) que se ejecuta en el servidor del ítem **1**. Esta distinción no es de importancia mientras trabajemos en forma local ---servidor y browser en la misma máquina---, pero debe ser tenida en cuenta al poner la aplicación en un servidor accesible en forma remota, pues no queremos que wxis sea directamente accesible desde otros clientes. Aquí también tenemos la opción de usar el mismo servidor (o host virtual), o bien usar uno separado; la opción elegida se registrará en el archivo ''settings.py''.
===== Permisos =====
Si usamos **SQLite** como base de datos para Django, el usuario bajo el cual corre el servidor del ítem **1** (e.g. //www-data//) debe tener permiso de escritura sobre el archivo de la base (''*.sqlite''), y sobre el directorio que lo contiene. Esto puede lograrse p.ej. con los comandos:
sudo chgrp -R www-data /path/to/sqlite_dir
sudo chmod -R 2750 /path/to/sqlite_dir
Para poder crear o modificar **bases ISIS**, el usuario bajo el cual corre el servidor del ítem **3** debe tener permiso de escritura sobre los archivos de estas bases y los directorios que las contienen, p.ej. de esta manera:
sudo chgrp -R www-data /path/to/isis_dir
sudo chmod -R 2750 /path/to/isis_dir
**NOTA:** El artículo [[http://articles.slicehost.com/2007/9/18/apache-virtual-hosts-permissions|Apache Virtual Hosts - permissions]] explica de manera sencilla el tema de configuración de permisos en el contexto de un host virtual de Apache. Aún no entiendo bien por qué el usuario principal (es decir, el dueño de los archivos de Catalis) debería agregarse al grupo //www-data//.
===== Ejemplo de configuración =====
El siguiente ejemplo usa un único host virtual para ocuparse de las tres funciones descriptas más arriba. Fue testeado en Apache 2.2 sobre Ubuntu 8.04 (Hardy).
**NOTA 1:** debe reemplazarse **''/PATH/TO/CATALIS''** por el path que corresponda.
**NOTA 2:** El uso del puerto 8080 es sólo a modo de ejemplo. Si se opta por usar un puerto alternativo para el virtual host, posiblemente la directiva ''Listen'' deba moverse al archivo de configuración ''ports.conf'' (sólo aplicable a Debian/Ubuntu?).
# Apache config for Catalis with Django, 2008-07-03
# Modified 2008-07-04
# Uses a prefix '/catalis' for all URLs
# See http://catalis.uns.edu.ar/doku/doku.php/django_con_apache_y_mod_python
Listen 8080
NameVirtualHost *:8080
# ------------------------------------------------------
# Optional directives
# ------------------------------------------------------
ServerName 127.0.0.1
#DocumentRoot (not needed!)
#CustomLog
#ErrorLog
# ------------------------------------------------------
# 1 - Dynamic content generated by Django
# ------------------------------------------------------
# Turn on mod_python for URLs beginning with '/catalis/'.
# All requests to these URLs will be handled by Django,
# with some exceptions (see below).
SetHandler python-program
PythonHandler django.core.handlers.modpython
# Specify which settings file is used
SetEnv DJANGO_SETTINGS_MODULE settings
# Add the directory where the settings live
PythonPath "['/PATH/TO/CATALIS/django_files'] + sys.path"
# Change this to 'Off' in a production environment
PythonDebug On
# ------------------------------------------------------
# 2 - Static files
# ------------------------------------------------------
# Turn off mod_python for serving static files (css, js, images, xml, ...).
# Note: in a virtual host we could use instead an appropriate value for DocumentRoot.
Alias /catalis/media/ "/PATH/TO/CATALIS/static_files/"
SetHandler None
Order Allow,Deny
Allow from all
Options +Indexes
# ------------------------------------------------------
# 3 - Access to ISIS databases via wxis
# ------------------------------------------------------
# We want to run wxis using '/catalis/cgi-bin/wxis'
ScriptAlias /catalis/cgi-bin/ "/PATH/TO/CATALIS/cgi-bin/"
# Turn off mod_python here too
SetHandler None
# Restrict access only to clients running on the same machine.
Order Deny,Allow
Deny from all
Allow from 127.0.0.1
===== Testeo de la configuración =====
**TO-DO:** agregar algo aquí, p.ej. verificar que no se pueda acceder a wxis desde afuera, pero sí en forma local.
===== Para Windows =====
(En construcción!)
* Python 2.5
* Django 0.96
* [[http://httpd.apache.org/download.cgi|Apache 2.2]] (versión: ''apache_2.2.9-win32-x86-openssl-0.9.8h-r2.msi''). Instalacion tipica, como servicio.
* [[http://httpd.apache.org/modules/python-download.cgi|mod_python]] (versión: ''mod_python-3.3.1.win32-py2.5-Apache2.2.exe'')
* instalar (ejecutar el ''.exe''); cuando pregunta por la carpeta de Apache, indicar la carpeta ''Apache2.2''.
* agregar línea en ''httpd.conf'':
LoadModule python_module modules/mod_python.so
* Configuración de Apache: crear un archivo ''conf/extra/catalis.conf'' y pegar allí la configuración sugerida más arriba (haciendo los cambios apropiados). Agregar esta línea al final de ''conf/httpd.conf'':
Include conf/extra/catalis.conf
{{tag>catalis desarrollo django apache}}