Desplegando una aplicación Django (Python) a un ambiente productivo con el servidor web Apache..

visitas.

El propósito de esta entrada no es enseñar el uso de la herramienta Django como tal, sino por el contrario ilustrar como desplegar una aplicación ya terminada en un ambiente productivo con un servidor Web Apache. Es inmediato pensar entonces que ya se debe tener la aplicación que se quiere desplegarse lista y terminada. Sin embargo por motivos de ilustracion elaboraré una aplicación simple que contará con un par de modelos, y activaré el administrador que incluye Django para trabajar con las vistas que de manera inmediata este me ofrece. La aplicación se llamará teofiapp y será accedida por el nombre www.teofilismo.com.

Este post indica una serie de requisitos que debemos tener en el host donde queremos hacer el deploy. A continuación los listo:

Pre-requisitos:
  • Apache Web Server (Instalado y funcionando correctamente)
  • Python 2.7
Iniciaremos con la creación de una aplicación Django simple. Para ello descargaremos e instalaremos Django como sigue:

tar -zxvf Django-1.3.1.tar.gz
cd Django-1.3.1
sudo python setup.py install

Creamos un directorio en nuestro home que contendrá la aplicación a desarrollar, y un proyecto Django con nuestra aplicación.

cd
mkdir Development
cd Development
django-admin.py startproject teoproject

Instalamos el motor de base de datos de nuestra conveniencia, para este caso usaré mysql (acostumbro a usar postgres). Nos conectamos al motor de base de datos y creamos un usuario y una base de datos para nuestra aplicación.

sudo apt-get install mysql-server
mysql -u root -p
create database teodb;
GRANT ALL ON test.* TO 'teoapp'@'localhost' IDENTIFIED BY 'teopass';
quit;

En el archivo settings.py de nuestro proyecto colocamos la configuración de la conexión a la base de datos que acabamos de crear. Editando la entrada DATABASES como ilustro a continuación:

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'teodb',
'USER': 'teoapp',
'PASSWORD': 'teopass',
'HOST': '',
'PORT': '',
}
}

No debemos olvidar instalar la interface para que python se pueda conectar con nuestro motor de base de datos, en este caso:

sudo apt-get install python-mysqldb

Sincronizamos las aplicaciones que Django nos provee por default con la base de datos con el comando.

python manage.py syncdb

Creamos una aplicación de nuestro proyecto:

python manage.py startapp teoapp

Definimos un par de modelos en el archivo teoapp/models.py:

from django.db import models
  class Team(models.Model):
    name = models.CharField(max_length=200)
    stars = models.IntegerField()

    def __unicode__(self):
       return self.name

  class Player(models.Model):
    team = models.ForeignKey(Team)
    name = models.CharField(max_length=200)
    last_name = models.CharField(max_length=200)
    born_date = models.DateTimeField('Fecha de cumples')

    def __unicode__(self):
      return self.name +" "+ self.last_name

Activamos nuestra aplicación en nuestro proyecto en el archivo settings.py agregándola como una entrada a INSTALLED_APPS:

INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'teoapp',
# Uncomment the next line to enable the admin:
#'django.contrib.admin',
# Uncomment the next line to enable admin documentation:
#'django.contrib.admindocs',
)

Activemos la aplicación Admin que Django nos ofrece para no elaborar vistas, para ello descomentamos en el fichero settings.py las entradas del INSTALLED_APPS dejándolo asi:

INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'teoapp',
# Uncomment the next line to enable the admin:
'django.contrib.admin',
# Uncomment the next line to enable admin documentation:
'django.contrib.admindocs',
)

También editamos en el archivo urls.py de nuestro proyecto y descomentamos las lineas indicadas a continuacion para el mapeo de la aplicación Admin:

from django.conf.urls.defaults import patterns, include, url
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
url(r'^admin/', include(admin.site.urls)),
)

Registramos por último nuestros modelos en la aplicación Administrador que Django nos provee, para ello creamos un archivo llamado admin.py en el directorio de nuestra aplicación con el siguiente contenido:

from teoapp.models import Team
from teoapp.models import Player

from django.contrib import admin

admin.site.register(Team)
admin.site.register(Player)

Hasta este punto puedes ejecutar el servidor de desarrollo que trae Django y visitar en la web la URL: http://127.0.0.1:8000/admin/. Para ejecutar el servidor:

python manage.py runserver

Debemos tener hasta este punto nuestra aplicación que queremos desplegar. Iniciamos con la definicion de un VirtualHost para encapsular nuestra aplicación bajo el nombre con el cual será accedida desde la red. Como se trata de una prueba y de una aplicación que no tiene un nombre reservado en internet, trabajaremos con el archivo de host de nuestra maquina y alli registraremos tal nombre. Agregando en el archivo /etc/hosts las siguientes dos lineas:

127.0.0.1 teofilism.com
127.0.0.1 www.teofilism.com

Copiamos el directorio de nuestro proyecto al directorio /var/www como sigue:

cd ..
sudo cp -Rf teoproject /var/www/
cd /var/www/teoproject/

Creamos un subdirectorio para el log de la aplicacion, para ello:

sudo mkdir logs
sudo touch logs/error.log
sudo touch logs/access.log

Editamos en el archivo setting.py de nuestro proyecto la entrada ROOT_URLCONF como se ilustra:

ROOT_URLCONF = 'urls'

Copiamos los archivos estáticos (CSS, js, imágenes) de la aplicación de admin que nos provee Django que utilizamos para no crear vistas.

mkdir static
mkdir static/admin
sudo cp -Rf /usr/local/lib/python2.7/dist-packages/django/contrib/admin/media/* static/admin/

Instalamos el modulo de apache para utilizar WSGI.
sudo apt-get inst all libapache2-mod-wsgi

Creamos el fichero teoapp/django.wsgi

import os
import sys
path = '/var/www/teoproject'
if path not in sys.path:
sys.path.append(path)
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

Posteriormente para la definicion del VirtualHost editamos el fichero que contiene la definicion de los VirtualHosts /etc/apache2/sites-enabled/000-default. Tal definicion puede ser agregada al final del archivo httpd.conf para las instalaciones de apache distintas a la actualidad debianistica.

<VirtualHost *>
 ServerName teofilismo.com
 ServerAlias www.teofilismo.com
 DocumentRoot /var/www/teoproject
 Alias /static/ /var/www/teoproject/static/
 WSGIScriptAlias / /var/www/teoproject/django.wsgi
 <Directory "/var/www/teoproject/static">
  Order allow,deny
  Allow from all
 </Directory>
 ErrorLog /var/www/teoproject/logs/error.log
 CustomLog /var/www/teoproject/logs/access.log combined
</VirtualHost>

Finalmente reiniciamos nuestro servidor web:

sudo /etc/init.d/apache2 restart

Y listo la podemos acceder desde la URL http://www.teofilismo.com/admin/ localmente.

Comentarios

  1. hey viejo julio cuando coloco estos comandos

    sudo apt-get install mysql-server
    me sale
    SyntaxError: invalid syntax
    Que puede ser? ayudame estoy nuevo en esto

    ResponderBorrar
  2. Estimado compañero o compañera, identifiquese. osea registrese como un seguidor del blog. Y para iniciar la ayuda: te pregunto tu estás en Windows jajajaja??

    Bromeaba, que distro de linux usas...???

    ResponderBorrar
  3. estoy usando windows. Hay una forma para hacer esto mismo en windows?

    ResponderBorrar
  4. Julio probe este ejemplo en ubunto 11.04, pero me sale este errror cuanodo corro el server

    python manage.py runserver

    IdentiatonError at/admin
    unpexpected ident (urls.py, line4)
    agradezco tu ayudaa

    ResponderBorrar
  5. En primera medida, deberías registrarte en el blog como un seguidor.

    Al parecer estuviste editando el archivo urls.py, y dejaste un error de identación en el código, recuerda que Python es un lenguaje al que le importa algo como escribamos el código. Utiliza los conceptos de bloques, etc. (revisa la tabulación)

    Saludos JMSO.

    ResponderBorrar

Publicar un comentario

Entradas más populares de este blog

Un par de cuadrados para todos

Dominós para todos. Parte I.

Crocancia de cuadrados en abundancia