McM
mcm@noway.es
Contact me: noway.es
Contact me

Tutorial: Instalación de Django

1. Instalación de Python

El código de Django está 100% escrito en puro Python así lo primero que necesitaremos es instalar python. Python se encuentra en los paquetes de cualquier sistema operativo basado en GNU/Linux.
Por ejemplo en debian:
como root:

root@McM:~$ apt-get install python

Actualmente versión 2.6. Para comprobar que la instalación de python se realizó con éxito, basta entrar en la consola de python:

root@McM:~$ python
Python 2.6.2 (release26-maint, Apr 19 2009, 01:56:41)
[GCC 4.3.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>

Vemos que la versión instalada es la 2.6.2

2. Instalación de una BBDD

Django es un framework donde cada uno de los modelos de datos utilizados tienen su correspondencia en una tabla de la BBDD, por ello debemos instalar una de las muchas BBDD que hay ('postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle') . Django esta preparado para soportar las más comunes en el mercado simplemente cambiando la variable DATABASE_ENGINE en el settings.py. De ello se hablará en el apartado de configuración de Django:

DATABASE_ENGINE = 'mysql'           # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.

Además de estas bases de datos que son oficialmente soportadas, existen backends desarrollados por 3rd parties que te permitirán usar otro tipo de Base de Datos con Django:

  • Sybase SQL Anywhere
  • IBM DB2
  • Microsoft SQL Server 2005
  • Firebird
  • ODBC

Tened cuidado porque las versiones de Django y las caracteristicas ORM soportadaspor estos backends no oficiales varian considerablemente. Cualquier duda especifica sobre estos backends serán redirigidas al soporte del 3rd party correspondiente.

Ademas del backend de la BBDD elegida, se necesitará instalar el binding de python correspondiente para su acceso:

  • Si utilizas PostgreSQL, necesitarás el paquete psycopg. Django soporta las versiones 1 y 2. Al configurar Django se ha de especificar que versión se está utilizando. (configuración en el settings.py)
    Si eres usuario de windows, existe una versión compilada no oficial.
  • Si usas MySQL, necesitarás MySQLdb, version 1.2.1p2 o superior.
  • Si usas SQLite and Python 2.3 o Python 2.4, necesitarás pysqlite. Usa la versión 2.0.3 or superior. Si usas Python 2.5 o superiror no necesitarás este paquete puesto que Python te ofrece un wrapper en las librerias estandar para acceder a SQLite. Lee las notas de SQLite detenidamente.
  • Si usas Oracle, necesitarás una copia de cx_Oracle, lee detenidamente las notas de instalación de Oracle y cx_Oracle.
  • Por último, si estas usando una versión no oficial de un 3rd party, contacta con ellos para que te faciliten la documentación necesaria y los requisitos para llevar a cabo la instalación.

Por ejemplo, instalaremos nuestro framework Django con mysql. En un sistema basado en debian como root:

root@McM:~$ apt-get install mysql-server
root@McM:~$ apt-get install python-mysqldb

3. Insatalación del framework Django

En la página oficial de Django, podreis encontrar la última versión estable:

root@McM:~$ wget http://www.djangoproject.com/download/1.1/tarball/
root@McM:~$ tar xzvf Django-\*.tar.gz

Realmente no es necesario mucho más, ni siquiera instalarlo en el sistema. Simplemente se puede añadir a la variable de sistema PYTHONPATH para que incluya así las librerias django:

PYTHONPATH=/path_a_la_aplicacion_django/:/path_al_codigo_fuente_django/

y también incluir:

DJANGO_SETTINGS_MODULE=<nombre_de_mi_proyecto>.settings

Donde path_al_codigo_fuente_django es el path de instalación, donde hemos descomprimido Django y .settings es donde se encuentra el settings.py con todos los parámetros de confguración del framework django.

El path_al_codigo_fuente_django seria:

root@McM:/tmp/Django-1.1$ ls
AUTHORS  docs      extras   LICENSE      PKG-INFO  scripts    setup.py
django   examples  INSTALL  MANIFEST.in  README    setup.cfg  tests

Si se desea, también se puede instalar para que estas variables aparezcan en el sistema:

root@McM:/tmp/Django-1.1$ python setup.py install

Esto no es estrictamente necesario ya que bastaría en un principio con meter en el sistema las variables antes mencionadas:

  • DJANGO_SETTINGS_MODULE
  • PYTHONPATH

Así por ejemplo si queremos usar las librerías de Django por consola:

root@McM:/tmp/Django-1.1$ echo $PYTHONPATH

root@McM:/tmp/Django-1.1$ export PYTHONPATH=/tmp/Django-1.1
root@McM:/tmp/Django-1.1$ python
Python 2.6.2 (release26-maint, Apr 19 2009, 01:56:41)
[GCC 4.3.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import django
>>> django.VERSION
(1, 1, 0, 'final', 0)

Esto es el mismo efecto que instalarlo en el sistema. Recordad que son simples librerías de python por lo que usando la variable de entorno PYTHONPATH debería ser suficiente.

4. Instalación de Apache y los mods necesarios.

Si quieres simplemente experimentar con Django, no se será necesaria esta sección ya que Django te facilita un pequeño servidor de aplicaciones para lanzar las mismas desde la consola. Ya lo comentaremos más adelante.

Pero si vas a utilizar Django en un sistema de producción, necesitarás instalar un servidor de aplicaciones más potente como Apache puesto que el servidor de aplicaciones que incluye Django no es suficientemente potente para estos entornos de producción.

Primeramente necesitarás instalar Apache como servidor de aplicaciones:

root@McM:~$ apt-get install apache2

A continuación necesitarás instalar el mod necesario para que apache pueda cargar código python al arrancar y se comunique con las librerias Django - python. Llegados a este punto puedes decantarte por dos tipos de modulos a instalar:

  • mod_python
  • mod_wsgi

Mod_wsgi es similar a mod_perl – hace que puedas utilizar código Python en Apache y cargar código Python in memoria cuando el servidor arranca. El codigo permanece en memoria según el ciclo de vida de un proceso en el servidor Apache, esto hace aumentar el rendimiento frente a otro tipo de servidores. Django funcionará con cualquier version of Apache que soporte mod_wsgi.

En sistemas GNU/Linux podrás encontrar el paquete: libapache2-mod-wsgi - Python WSGI adapter module for Apache

root@McM:~$ apt-get install libapache2-mod-wsgi

Ojo! Echad un ojo al apartado de configuración del apache. Podreis encontrarlo más adelante.

Si no puedes instarlar mod_wsgi, una gran alternativa es utilizar el antiguo mod_python. Es el predecesor del módulo wsgi pero funciona perfectamente y con grandes resultados.

También se puede encontrar el paquete en los sistemas GNU/Linux: libapache2-mod-python - Python-embedding module for Apache 2

La instalación resulta sencilla:

root@McM:~$ apt-get install libapache2-mod-python

Ojo! Ver el apartado de configuración del apache para más detalles.

5. Configuración del apache.

5.1 Usando el módulo mod_wsgi

Como se ha indicado, es recomendable en entornos de producción usar este tipo de módulos ya que aumentan el rendimiento de manera considerable. Este módulo de Apache puede utilizarse con cualquier aplicación que soporte la interfaz Python WSGI (http://www.python.org/dev/peps/pep-0333/) incluida en Django. Django funcionará con cualquier versión que soporte este mod_wsgi.

5.1.1 Configuración básica
Una vez instalado el mod_wsgi como se ha indicado arriba se creará una nueva configuración dentro del apache, un nuevo site dentro de site-available. El path típico de instalación del Apache será: /etc/apache2/sites-available/.
En esta nueva configuración añadiremos:

WSGIScriptAlias / /path/to/mysite/apache/django.wsgi

Esto indica que tu despacharás la aplicación en / y el segundo argumento indica al apache donde esta el archivo WSGI dentro de nuestra aplicación. (ver más adelante).

A continuación se necesitará crear esta aplicación WSGI asi que hay que crear el archivo mencionado arriva en WSGIScriptAlias (/path/to/mysite/apache/django.wsgi):

import os
import sys

os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

Si tu proyecto no esta en tu PYTHONPATH, puedes añadir:
sys.path.append('/usr/local/django')

justo arriba de la linea import.

5.1.2 Despachando archivos multimedia (contenido estatico)

Django no despacha los archivos multimedia sino que deja el trabajo al servidor de aplicaciones que tu elijas.

Es altamente recomendable usar otro servidor de aplicaciones independiente. Uno para Django y otro para todo tipo de contenido multimedia estático. Algunas opciones pueden ser:

  • lighttpd
  • Nginx
  • TUX
  • A stripped-down version of Apache
  • Cherokee

Si no tienes otra alternativa para servir estos archivos, puedes hacerlo en el mismo VirtualHost de tu Apache que esta sirviendo la aplicación Django. De esta manera, tendrás que configurar tu Apache para servir las URL estáticas además de las otras URL usando mod_wsgi.

A continuación ponemos un ejemplo de cómo servir esta mezcla de contenidos estáticos y dinámicos. En este ejemplo vemos que se cofigura Django en el root del site pero se especifica que robots.txt, favicon.ico, cualquier archivo CSS y cualquier archivo en el directorio /media/ como contenido estático. Todas las demas URL se servirán usando el módulo de apache mod_wsgi:

Alias /robots.txt /usr/local/wsgi/static/robots.txt
Alias /favicon.ico /usr/local/wsgi/static/favicon.ico

AliasMatch /([^/]*\.css) /usr/local/wsgi/static/styles/$1

Alias /media/ /usr/local/wsgi/static/media/

<Directory /usr/local/wsgi/static>
Order deny,allow
Allow from all
</Directory>

WSGIScriptAlias / /usr/local/wsgi/scripts/django.wsgi

Podeis encontrar más detalles de cómo servir este tipo de contenidos estáticos en: Configuration guidelines mod_wsgi

<Directory /usr/local/wsgi/scripts>
Order allow,deny
Allow from all
</Directory>

5.2 Usando el módulo mod_python

Mod_pyton es otro de los módulos para Apache que pueden ser usados para desplegar aplicaciones Django en servidores de producción. Es anterior al mod_wsgi pero por ahora se sigue utilizando bastante.

De igual manera, este módulo está inspirado en mod_perl y con él conseguimos utilzar Python en nuestro Apache y poder cargar código Python en memoria cuando el servidor arranque. Como se ha indicado antes, el código permanece en memoria según el ciclo de vida de cualquier proceso Apache, esto lleva a aumentar el rendimiento del servidor de aplicaciones.

Un requisito indispensable para Django es utilizar Apache 2.x y mod_python 3.x y utilizar Apache prefork MPM en lugar de worker MPM.

5.2.1 Configuración básica.

Como se ha indicado antes se creará un nuevo site en ls /etc/apache2/sites-available/, por ejemplo , default.

root@McM:~$ vim /etc/apache2/sites-available/default

En el se especifica un nuevo VirtualHost a utilizar, se determina que se usará un handler python para servir la aplicación django. Además se especifica la variable Pythonpath donde se determina el path a tu aplicación y el path al código fuente de Django

<VirtualHost 0.0.0.0:80>
        ServerName name.of.de.server

        ErrorLog "/tmp/error_log"
        CustomLog "/tmp/access_log" common

        <Location "/">
           SetHandler python-program
           PythonHandler django.core.handlers.modpython
           SetEnv DJANGO_SETTINGS_MODULE mysite.settings
           PythonPath "['/path_a_tu_aplicacion/','/path_to_django_installation/django/src'] + sys.path"
           PythonOption django.root /
           PythonDebug On
        </Location>

[..]

</VirtualHost>

PythonOption django.root / es una opción nueva en Django 1.x. Si se configurara PythonOption django.root /mysite, Django añadiría automáticamente /mysite a todas las urls de la aplicación. Así puedes añadir mas sites bajo otras urls, por ejemplo añadir /mysite2, para ello solo tendrás que cambiar la opción django.root.

Es mejor añadir la opción PythonPath aquí aunque se puede quitar si la variable PYTHONPATH del sitema se encuentra ya correctamente configurada.
Como se puede observar también se introduce en el path la variable sys.path por si se importan otras librerías y se hace uso de ellas.
Para temas de rendimiento también se pueden añadir otras directivas como PythonAutoReload Off. Para ello lo mejor es echar un vistazo a la documentación del mod_python: http://modpython.org/live/current/doc-html/directives.html

Incluso podemos tener varias aplicaciones Django corriendo en el mismo apache:

NameVirtualHost *
<VirtualHost *>
    ServerName www.example.com
    # ...
    SetEnv DJANGO_SETTINGS_MODULE mysite.settings
</VirtualHost>

<VirtualHost *>
    ServerName www2.example.com
    # ...
    SetEnv DJANGO_SETTINGS_MODULE mysite.other_settings
</VirtualHost>

Si tienes varias instalaciones Django en el mismo VirtualHost, añadir la directiva PythonInterpreter para que el Apache sepa servir el contenido correctamente y no se lie con la CACHE:

<VirtualHost *>
    ServerName www.example.com
    # ...
    <Location "/something">
        SetEnv DJANGO_SETTINGS_MODULE mysite.settings
        PythonInterpreter mysite
    </Location>

    <Location "/otherthing">
        SetEnv DJANGO_SETTINGS_MODULE mysite.other_settings
        PythonInterpreter othersite
    </Location>
</VirtualHost>

Los valores de PythonInterpreter no son significantes, cualquiera vale con tal de diferenciar las dos instalaciones diferentes de Django.

Una práctica para depurar es limitar MaxRequestsPerChild a 1 para así evitar tener que hacer un restart del apache cada vez que haces un cambio en el código. De esta manera no se almacena en la CACHE el contenido y cada nueva petición es interpretada y servida.

5.2.1 Contenido multimedia

Como se ha indicado antes Django no está preparado para servir contenido multimedia. De este trabajo se encarga el servidor de aplicaciones que elijas.

Es altamente recomendable tener un servidor de aplicaciones distinto que sirva todo este tipo de contenido estático, para eso se puede utilizar cualquiera de los siguientes:

  • lighttpd
  • Nginx
  • TUX
  • A stripped-down version of Apache
  • Cherokee

Si por la razón que sea no se puede llegar a tener otro servidor de aplicaciones, puedes configurar el VirtualHost del apache para que sirva este tipo de contenido estático. Basta indicarle al Apache que en una determinada "Location" no se utilice ningún handler para servir el contenido:

<Location "/media">
    SetHandler None
</Location>

También podremos indicar al Apache que no sirva las URL que terminan en jpg, gif o png con el mod_python sino que no utilice ningun handler para servirlas:

<Location "/">
    SetHandler python-program
    PythonHandler django.core.handlers.modpython
    SetEnv DJANGO_SETTINGS_MODULE mysite.settings
</Location>

<Location "/media">
    SetHandler None
</Location>

<LocationMatch "\.(jpg|gif|png)$">
    SetHandler None
</LocationMatch>

Share it!

Twitter Gmail Delicious Google Bookmarks Hotmail Yahoo Mail Share/Bookmark