Desplegando una aplicación Django (Python) a un ambiente productivo con el servidor web Apache..
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.
hey viejo julio cuando coloco estos comandos
ResponderBorrarsudo apt-get install mysql-server
me sale
SyntaxError: invalid syntax
Que puede ser? ayudame estoy nuevo en esto
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??
ResponderBorrarBromeaba, que distro de linux usas...???
estoy usando windows. Hay una forma para hacer esto mismo en windows?
ResponderBorrarJulio probe este ejemplo en ubunto 11.04, pero me sale este errror cuanodo corro el server
ResponderBorrarpython manage.py runserver
IdentiatonError at/admin
unpexpected ident (urls.py, line4)
agradezco tu ayudaa
En primera medida, deberías registrarte en el blog como un seguidor.
ResponderBorrarAl 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.