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/
Hola, que tal?
Te hago una consulta simple que no logro resolver. ¿Como podría hacer para que en mi app de heroku pueda ver los errores de Django? Por default te muestra este mensaje: http://s3.amazonaws.com/heroku_pages/error.html
Me refiero a error donde te muestra archivo y linea donde está el problema.
Gracias!!
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.
Hize todos los pasos y me da Application Error