Empezando un proyecto Django en Heroku

Basta que yo quiera hacer algo para disfrutar la vida, como ir a pescar, se pone feo el tiempo y fuerza que me quede en la cueva a picar codigo, como todos saben Django es un framework MVC web para Python y Heroku es un servicio de Cloud para hostear aplicaciones.

Este fin de semana me puse a jugar un poco a ver como podía levantar una App Django en Heroku, aquí va un poco la experiencia.

Aviso que estos pasos van a ser para OSX (Lion), probablemente en cuanto tenga un tiempo voy a probarlo sobre Linux asi que actualizaré el post o crearé uno nuevo.

Preparando el entorno

Antes de empezar a hablar, asumo que saben algo de Python y Git, ademas que tienen instalado Python, easy_install, pip, git y las herramientas relacionadas.

Para empezar, Heroku provee un servicio para correr aplicaciones Django junto con PostgreSQL, asi que tuve que instalar Django y PostgreSQL.

Viendo como instalar Django encuentro que es recomendado utilizar virtualenv, esta es una herramienta que permite tener entornos específicos de librerías python por cada proyecto, esto para poder trabajar con diferentes versiones si es necesario. Así que como ya tenía python instalado comencé por instalar virtualenv, esta herramienta se instala por medio de easy_install.

sudo easy_install virtualenv

Una vez instalado van a necesitar tener corriendo un PostgreSQL, probe instalarlo por el instalador para Mac del sitio de PostgreSQL pero tuve problemas con la librería SSL (libpq requiere libssl-1.0.0 y Lion trae libss-0.9.8) así que desinstale el paquete y realicé una instalación por brew

brew install postgresql

Ojo, Al terminar la instalación brew informa los pasos manuales a seguir para inicializar el espacio de tablas de postgres y arrancar el servicio, presenten atención y sigan esos pasos.

Por último al trabajar con Heroku necesitamos la herramienta toolbet para interactuar con el servicio, esta herramienta la pueden descargar desde aquí

https://toolbelt.herokuapp.com/

Creando el entorno

El siguiente paso es crear el entorno virtual, para eso usamos virtualenv. Creen un directorio para su proyecto y dentro de ese directorio crearemos el entorno virtual.

mkdir mydjango
cd mydjango
$ virtualenv venv --distribute

Eso creará un directorio llamado venv que contendrá las utilidades para levantar el entorno virtual, para empezar a trabajar necesitan setear el entorno virtual, para eso deben ejecutar el comando source.

source venv/bin/activate

Ojo que esto funcionará solo en la terminal el curso, si abren un nuevo tab deben correr nuevamente el comando.

Una vez dentro del entorno virtual deben instalar las libs de python con pip.

pip install Django psycopg2 dj-database-url

La primera es el framework, la segunda es el driver para trabajar con posgresql y la última algo que usa Heroku para setear la conexión en la cloud.

Iniciando el Proyecto

Una vez que tengan esto listo podemos largar con el proyecto Django. Vamos a crear un proyecto nuevo para trabajar

django-admin.py startproject mydjango

Una vez creado, deberíamos configurar la app, así que vamos a mydjango/settings.py y seteamos las conexiones a la base de datos. Como en Heroku vamos a tener un configuración diferente a la que tenemos localmente encontré una sugerencia donde decían setear una variable de entorno para identicar que estamos en dev, asi switcheamos las configuraciones. Al final del settings.py deben tener algo así.

import dj_database_url
import os

if bool(os.environ.get('LOCAL_DEV', False)): 
  DATABASES = {
      'default' : {
         'ENGINE' : 'django.db.backends.postgresql_psycopg2',
         'NAME' : 'db_name',
         #setear USERNAME Y PASS si necesitan.
      }
  } 
else: 
  DATABASES = {
      'default' : dj_database_url.config(default='postrgres://localhost')
  }

Entonces, si LOCAL_DEV esta definida y vale true va a user la el clásico setup, sino va a usar la conf de heroku. Como siempre vamos a tener que switchear al virtual env no estaría de mas añadir al script de virtual env el export LOCAL_DEV=true para setear el localenv.

echo 'export LOCAL_DEV=true' >> venv/bin/activate

Bueno, de aquí en mas es hora de trabajar con Django, configurar lo que necesitan, escribir algo de código, crear unos módulos probar que anda, asi que si saben Django van por su cuenta, si estan perdidos les recomiendo esta guía

https://docs.djangoproject.com/en/dev/intro/tutorial01/.

Subiendo la app a Heroku

Una vez que ya sacaron la App andando y la quieren publicar, hay que preparar todo para subir a Heroku, de aqui en mas estoy asumiendo que tienen una cuenta en Heroku y estamos listos para trabajar.

Lo primero es freezar las librerías del virtualenv para pasarlas a nuestra instancia en heroku, para ello usamos pip en el root del proyecto.

$ pip freeze > requirements.txt
$ cat requirements.txt
Django==1.4
psycopg2==2.4.5
dj-database-url==0.2.0

Ese archivo requirements.txt tendrá la lista de librerías que tenemos en nuestro virtualenv que necesitan ser instaladas en heroku para nuestra app, Heroku hará esto por nosotros automáticamente. Ante cualquier nueva instalación de librerías tendrán que actualizar el file.

Heroku utiliza git para pushear files a deployear, cada push será automáticamente deployeado (osea tenemos integración continua grátis). Asi que tenemos que setear git en nuestro proyecto. Para setear git simplemente vamos hasta el root del proyecto, creamos un archivo llamado .gitignore para omitir todos los *.pyc y el virtualenv (venv), añadan esto al archivo

venv
*.pyc

Una vez seteado hay que inicializar  el repo.

$ git init
$ git add .
$ git commit -m "my django app in heroku"

Con eso ya estamos casí listo, el paso final crear la app y pushear.

Nota, si quieren tener el repo en github o cualquier otro server, pueden añadir otro origen y pushean a ese normalmente, luego deployean a heroku pusheando lo que tienen al origen heroku.

Pusheando a Heroku

Para empezar tenemos que crear la app, para eso usamos la utilidad de lineas de comando de heroku, si nunca antes usaron la app la primera vez van a tener que hacer un login.

 heroku login

Luego pueden proceder con la creación de la app.

heroku create YOUR_APP_NAME

Una vez terminado, este comando crea la app y setea el repo con un nuevo origen para pushear, heroku master, cada vez que pusheemos algo a esa remote location será automáticamente deployeada a nuestra instancia, asi que básicamente tenemos que hacer algo así

git push heroku master

Si crearon modelos y necesitan hacer sync del modelo en heroku, tienen que usar la herramienta nuevamente

heroku run python manage.py syncdb

Igual si quieren usar la django shel

heroku run python manage.py shell

Cerrando la Bocha

Con eso ya estarían para comenzar a experimentar en serio, ante cualquier duda me avisan, si ven algún error tambien.

Les dejo unos links que me ayudaron en el proceso

http://hackercodex.com/guide/python-install-django-on-mac-osx-lion-10.7/

https://devcenter.heroku.com/articles/django

https://docs.djangoproject.com/en/dev/intro/tutorial01/

Share

3 comments

  1. Heroku tiene una configuración quasi producción, no te debería mostrar los errores por pantalla. Tenes que mirar los logs con el comando heroku logs. Fijate si con eso te sirve, sino avisa.

Leave a Reply

Your email address will not be published. Required fields are marked *