Django en Bluehost

Este año compré el dominio juliobs.com y un alojamiento en
bluehost.com; hasta ahora solo tiene una copia de mi web antigua, hecha
desde cero en PHP, y este blog.
Pero por fin llegaron las vacaciones y tendré algo de tiempo para rehacerlo todo.
Ahora quiero crear una web más profesional y fácil de mantener, buenas excusas para usar un CMS o un
framework.
Ya he creado webs con Joomla y hasta me gustó, pero quiero algo distinto,
más pythónico…
Exacto: ¡voy a usar Django!
Hace tiempo que quiero trastear con este framework y, como estoy estudiando bastante Python, uniré
lo útil a lo agradable.
El único problema es que Bluehost no da soporte oficial a Django, no está incluido en simplescripts y la versión de Python del servidor es la 2.4, cuando la mínima recomendada es la 2.5.
En esta entrada muestro paso a paso cómo sortear ese problema e instalar Django en Bluehost.
Instalación de Python 2.7
Ponte en contacto con el soporte técnico y pide acceso por SSH. Su soporte es muy bueno y el acceso debería activarse el mismo día.
Entra en tu máquina por SSH y descarga el Python2 más reciente (2.7.3):
julio@julio-acer ~> ssh juliobs.com Enter passphrase for key '/home/julio/.ssh/juliobs':juliobor@box780 ~ $ wget http://python.org/ftp/python/2.7.3/Python-2.7.3.tgz juliobor@box780 ~ $ tar xvfz Python-2.7.3.tgzVe a la carpeta extraída, configura e instala Python con soporte de wide Unicode:
juliobor@box780 ~ $ cd Python-2.7.3 juliobor@box780 ~/Python-2.7.3 $ ./configure --prefix="$HOME" --enable-unicode=ucs4 juliobor@box780 ~/Python-2.7.3 $ make juliobor@box780 ~/Python-2.7.3 $ make installSi todo ha ido bien, ya puedes ejecutar el nuevo Python así:
juliobor@box780 ~ $ ~/bin/python Python 2.7.3 (default, May 23 2012, 23:29:34) [GCC 4.1.2 20080704 (Red Hat 4.1.2-52)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>>Edita tu
~/.bashrcpara exportar la variablePATHcada vez que arranque Bash (el orden importa):export PATH=$HOME/bin:$PATHjuliobor@box780 ~ $ echo $PATH /home7/juliobor/bin:/usr/lib64/qt-3.3/bin:/home7/juliobor/perl5/bin:/usr/kerberos/bin:/ramdisk/bin:/usr/bin:/binEjecuta el .bashrc y comprueba que el Python que se llama con el comando
pythones la versión que acabas de instalar:juliobor@box780 ~ $ source .bashrc juliobor@box780 ~ $ python Python 2.7.3 (default, May 23 2012, 23:29:34) [GCC 4.1.2 20080704 (Red Hat 4.1.2-52)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>>Ya puedes borrar los archivos usados en la instalación.
juliobor@box780 ~ $ rm -r Python-2.7.3.tgz Python-2.7.3/
¡Listo! Python ya está actualizado y podemos empezar la instalación de Django.
Instalación de Django
Hay varias formas de conseguir Django. Para mí la más sencilla es a través de un sistema de control de versiones, porque facilita actualizarlo en el futuro y permite desarrollar con la última versión disponible.
Pero ten en cuenta que usar el trunk/master instalará la última versión, todavía en pruebas y por tanto no recomendada para webs que necesitan estabilidad. No es mi caso.
Yo recomiendo usar git, ya que movieron el desarrollo de Django a GitHub, pero también hay mirrors en svn y mercurial (bluehost no tiene mercurial instalado).
Para actualizarlo después basta con ejecutar
git pullsi usas git osvn updatesi usas SVN.Actualiza setuptools e instala pip:
juliobor@box780 ~ $ wget http://pypi.python.org/packages/2.7/s/setuptools/setuptools-0.6c11-py2.7.egg juliobor@box780 ~ $ sh setuptools-0.6c11-py2.7.egg juliobor@box780 ~ $ rm setuptools-0.6c11-py2.7.eggjuliobor@box780 ~ $ easy_install pipO ejecuta el script https://bootstrap.pypa.io/get-pip.py
Instala el módulo de Django.
La forma más fácil de instalar Django es con pip. Este comando lo descarga e instala directamente desde GitHub, y además evita tener que tocar mucho el $PATH.
juliobor@box780 ~ $ pip install git+https://github.com/django/django.gitAlternativas:
- Usar pip, pero manteniendo el directorio del control de versiones:
sudo pip install -e ~/django/(más fácil de mantener al día congit pull) - Crear un archivo .pth en la carpeta site-packages apuntando al directorio descargado con git/svn
- Instalar con
setup.py install --user
- Usar pip, pero manteniendo el directorio del control de versiones:
Vuelve a editar el “~/.bashrc” así:
export PATH=$HOME/bin:$HOME/.local/bin:$PATHjuliobor@box780 ~ $ echo $PATH /home7/juliobor/bin:/home7/juliobor/.local/bin:/usr/lib64/qt-3.3/bin:/home7/juliobor/perl5/bin:/usr/kerberos/bin:/ramdisk/bin:/usr/bin:/binComprueba que puedes importar Django:
juliobor@box780 ~ $ python Python 2.7.3 (default, May 23 2012, 23:29:34) [GCC 4.1.2 20080704 (Red Hat 4.1.2-52)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import django >>> django.VERSION (1, 5, 0, 'alpha', 0) >>> print django.get_version() 1.5Para usar el protocolo FastCGI hay que instalar Flup:
juliobor@box780 ~ $ pip install flupAlternativa:
juliobor@box780 ~ $ wget http://www.saddi.com/software/flup/dist/flup-1.0.2.tar.gz juliobor@box780 ~ $ tar xvfz flup-1.0.2.tar.gz juliobor@box780 ~ $ cd flup-1.0.2 juliobor@box780 ~/flup-1.0.2 $ python setup.py build juliobor@box780 ~/flup-1.0.2 $ python setup.py install
Listo, Django ya está instalado. Podemos crear un proyecto de prueba para aprender las operaciones básicas y ver si todo funciona bien.
Crear un proyecto
Crea un directorio de proyectos en algún sitio no accesible desde la web (es decir, fuera de
~/public_html). Por ejemplo:juliobor@box780 ~ $ mkdir django_projects; cd django_projectsCrea un proyecto dentro de tu carpeta de proyectos
juliobor@box780 ~/django_projects $ django-admin.py startproject juliobsSi no usaste pip, seguramente tendrás que editar el $PATH para usar django-admin.py como en el comando anterior:
juliobor@box780 ~ $ export PATH=/home7/juliobor/django/django/bin:$PATHEdita el archivo
settings.pycon la configuración de tu base de datos.'ENGINE': 'django.db.backends.sqlite3', 'NAME': '/home7/juliobor/django_projects/mysite/testDB',sqlite3 está bien para pruebas, pero recomiendo usar PostgreSQL. Tendrás que instalar psycopg2:
juliobor@box780 ~ $ pip install psycopg2Alternativa:
juliobor@box780 ~ $ easy_install psycopg2Ejecuta este comando para crear las tablas de la base de datos. Responde no si te pide crear un usuario: juliobor@box780 ~/django_projects/juliobs $ python manage.py syncdb
Crea un archivo
.fcgien~/public_html(o en un subdirectorio si quieres)Edita el archivo
django.fcgiy hazlo ejecutable:#!/home7/juliobor/bin/python import sys import os # Add a custom Python path. sys.path.insert(0,"/home7/juliobor/django_projects/juliobs") sys.path.insert(0,"/home7/juliobor/bin") os.chdir("/home7/juliobor/django_projects/juliobs") # Set the DJANGO_SETTINGS_MODULE environment variable. os.environ['DJANGO_SETTINGS_MODULE'] = "juliobs.settings" from django.core.servers.fastcgi import runfastcgi runfastcgi(method="threaded", daemonize="false")juliobor@box780 ~/public_html $ chmod a+x django.fcgiAñade un
.htaccessSi Django está en la raíz de la web:
AddHandler fcgid-script .fcgi Options +SymLinksIfOwnerMatch RewriteEngine On RewriteBase / RewriteRule ^(media/.*)$ - [L] RewriteCond %{REQUEST_URI} !(django.fcgi) RewriteRule ^(.*)$ django.fcgi/$1 [L]Si la web está en
/django:~/public_html/.htaccessAddHandler fcgid-script .fcgi Options +SymLinksIfOwnerMatch RewriteEngine On RewriteBase / RewriteRule ^(django\.fcgi/.*)$ - [L] RewriteRule ^(.*)$ /django/django.fcgi/$1 [L]
Ahora ya puedes seguir cualquier tutorial de Django. Yo estoy aprendiendo casi todo leyendo The Django Book (The Definitive Guide to Django), que tiene esa vista previa web, está bastante actualizado y explica bien los conceptos.
Django + Apache + mod_wsgi
Por motivos obvios no voy a desarrollar directamente en el servidor donde está alojada mi web, sino
en mi propio portátil. Django tiene una forma cómoda de probar la web sin instalar un servidor:
ejecutar el comando python2 manage.py runserver
La web debería verse en http://localhost:8000
Pero algunas cosas son más difíciles de probar así y, como ya tengo Apache instalado, me resulta mucho más práctico desarrollar y probar en mi Apache.
Instala django desde git con pip:
julio@julio-acer ~> sudo pip2 install git+https://github.com/django/django.gitInstala
mod_wsgi:julio@julio-acer ~> sudo pacman -S mod_wsgiEdita el
wsgi.py:import os import sys # Añade la ruta del proyecto y su directorio padre al sys.path (hace falta para # import juliobs.settings). También se puede hacer en httpd.conf con PythonPath sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "../../"))) sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "../"))) os.environ.setdefault("DJANGO_SETTINGS_MODULE", "juliobs.settings") from django.core.wsgi import get_wsgi_application application = get_wsgi_application()Edita el
http.confLoadModule wsgi_module modules/mod_wsgi.so #WSGI - (para Django) WSGIScriptAlias /django /media/externo/Documentos/Programacao/Web/django_projects/juliobs/wsgi.py WSGIPythonPath /media/externo/Documentos/Programacao/Web/django_projects/juliobs/ <Directory /media/externo/Documentos/Programacao/Web/django_projects/juliobs> <Files wsgi.py> Order deny,allow Allow from all </Files> </Directory> Alias /media/ /media/externo/Documentos/Programacao/Web/django_projects/juliobs/juliobs/media/ <Directory /media/externo/Documentos/Programacao/Web/django_projects/juliobs/juliobs/media> SetHandler None Order allow,deny Allow from all </Directory>Deberías poder acceder a la web en http://localhost/django
Pon tu web bajo control de versiones
Ahora que ya tenemos todo funcionando podemos empezar a desarrollar la web. Conviene recordar que
Si no quieres dejar el código de tu web en un repositorio como GitHub, una buena alternativa es rsync
julio@julio-acer Web/django/django_projects> rsync -avze --delete ssh juliobs juliobor@juliobs.com:~/django_projects
Observaciones:
Error al crear el superusuario:
python manage.py createsuperuser return getpass.getuser().decode(locale.getdefaultlocale()[1]) TypeError: decode() argument 1 must be string, not Nonelo resolví definiendo el locale:
juliobor@box780 ~ $ export LANG=en_US.UTF-8En Arch Linux el
mod_wsgies para Python3; hay que instalarmod_wsgi2.
Links
- https://docs.djangoproject.com/en/dev/howto/deployment/fastcgi/
- http://alextreppass.co.uk/getting-django-working-on-bluehost
- http://blog.ruedaminute.com/2011/01/2011-installation-instructions-for-django-on-bluehost/
- http://www.techgeekguy.com/2011/01/how-to-install-python-svn-django-osqa-web-hosting-server-hostmonster-dreamhost-bluehost-godaddy-hostgator/
- https://my.bluehost.com/cgi/help/000585

Soy un ingeniero informático brasileño radicado en Alemania, apasionado por la tecnología, la ciencia, la fotografía y los idiomas.
Llevo programando cerca de dos décadas, explorando desde apps móviles y desarrollo web hasta aprendizaje automático. Hoy me enfoco en SRE en la nube e ingeniería de datos.
Soy voluntario en las comunidades de open source y Python, ayudando a organizar PyCon DE y PyData Berlin, dando mentorías y contribuyendo con código y traducciones.
En mi blog comparto consejos de Linux, guías de configuración y notas personales que escribí como referencia futura. Espero que también sean útiles para otras personas. El contenido está disponible en varios idiomas.
Visita mi galería para ver algunas de mis fotografías.
Fuera del teclado, me encontrarás en conciertos, tocando el clarinete, en bicicleta, buceando o explorando nuevos lugares, culturas y cocinas.
¡Siempre feliz de conectar! 🙂