Django en Bluehost

dic 28, 2011·
Julio Batista Silva
Julio Batista Silva
· 7 min de lectura
blog Linux

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

  1. 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.

  2. 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.tgz
    
  3. Ve 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 install
    

    Si 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.
    >>>
    
  4. Edita tu ~/.bashrc para exportar la variable PATH cada vez que arranque Bash (el orden importa):

    export PATH=$HOME/bin:$PATH
    
    juliobor@box780 ~  $  echo $PATH
    /home7/juliobor/bin:/usr/lib64/qt-3.3/bin:/home7/juliobor/perl5/bin:/usr/kerberos/bin:/ramdisk/bin:/usr/bin:/bin
    
  5. Ejecuta el .bashrc y comprueba que el Python que se llama con el comando python es 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.
    >>>
    
  6. 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

  1. 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 pull si usas git o svn update si usas SVN.

  2. 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.egg
    
    juliobor@box780 ~  $  easy_install pip
    

    O ejecuta el script https://bootstrap.pypa.io/get-pip.py

  3. 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.git
    

    Alternativas:

    • Usar pip, pero manteniendo el directorio del control de versiones: sudo pip install -e ~/django/ (más fácil de mantener al día con git pull)
    • Crear un archivo .pth en la carpeta site-packages apuntando al directorio descargado con git/svn
    • Instalar con setup.py install --user
  4. Vuelve a editar el “~/.bashrc” así:

    export PATH=$HOME/bin:$HOME/.local/bin:$PATH
    
    juliobor@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:/bin
    
  5. Comprueba 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.5
    
  6. Para usar el protocolo FastCGI hay que instalar Flup:

    juliobor@box780 ~  $  pip install flup
    

    Alternativa:

    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_projects
    
  • Crea un proyecto dentro de tu carpeta de proyectos

    juliobor@box780 ~/django_projects  $  django-admin.py startproject juliobs
    

    Si 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:$PATH
    
  • Edita el archivo settings.py con 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 psycopg2
    

    Alternativa:

    juliobor@box780 ~  $  easy_install psycopg2
    
  • Ejecuta 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 .fcgi en ~/public_html (o en un subdirectorio si quieres)

    Edita el archivo django.fcgi y 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.fcgi
    
  • Añade un .htaccess

  • Si 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/.htaccess

    AddHandler 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.

  1. Instala django desde git con pip:

    julio@julio-acer ~> sudo pip2 install git+https://github.com/django/django.git
    
  2. Instala mod_wsgi:

    julio@julio-acer ~> sudo pacman -S mod_wsgi
    
  3. Edita 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()
    
  4. Edita el http.conf

    LoadModule 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>
    
  5. 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 None
    

    lo resolví definiendo el locale:

    juliobor@box780 ~  $  export LANG=en_US.UTF-8
    
  • En Arch Linux el mod_wsgi es para Python3; hay que instalar mod_wsgi2.


Julio Batista Silva
Autores
Senior Cloud Developer

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! 🙂

comments powered by Disqus