Django no Bluehost

Este ano eu comprei o domínio juliobs.com e uma hospedagem no bluehost.com, até agora ele só possui uma cópia do meu antigo site, feito from scratch em PHP e este blog.
Mas finalmente chegaram minhas férias e terei algum tempo para refazer tudo.

Agora penso em criar um website mais profissional e fácil de manter, boas desculpas para usar um CMS ou um framework.
Já criei sites com Joomla e até gostei, mas eu quero algo diferente, mais pythonico…

Exatamente, usarei Django!
Já faz algum tempo que quero mexer com esse framework e como estou estudando bastante Python, unirei o útil ao agradável.

O único problema é que o Bluehost não da suporte oficial ao Django, ele não está incluido no simplescripts e a versão do Python disponível no servidor é a 2.4, quando a mínima recomendada é a 2.5.

Neste post eu mostrarei um passo-a-passo de como contornar esse problema e instalar o Django no Bluehost.

Instalação do Python 2.7

  1. Entre em contato com o suporte técnico e peça acesso por SSH. O suporte deles é muito bom e o login deverá ser liberado no mesmo dia.

  2. Acesse sua box por SSH e faça download do Python2 mais recente (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. Vá à pasta extraída, configure e instale o Python com suporte a 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
    

    Se tudo deu certo, você já pode executar o novo Python da seguinte forma:

    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. Edite seu ~/.bashrc para exportar a variável PATH sempre que o Bash iniciar (a ordem 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. Rode o .bashrc e teste se o Python chamado com o comando python é a versão que você acabou 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. Pode deletar os arquivos utilizados na instalação.

    juliobor@box780 ~  $  rm -r  Python-2.7.3.tgz Python-2.7.3/
    

Pronto! O Python já está atualizado e podemos iniciar a instalação do Django.

Instalação do Django

  1. Existem várias formas de obter o Django. Para mim, o método mais simples é por algum sistema de controle de versão, pois facilita a atualização no futuro e permite desenvolver usando a última versão disponível.

    Mas note que usar o trunk/master irá instalar a última versão ainda em fase de testes e portanto não recomendada para sites que precisam de estabilidade. Não é meu caso.

    Eu recomendo usar o git, pois moveram o desenvolvimento do Django para o GitHub, mas também existem mirrors no svn e mercurial (o bluehost não possui mercurial instalado).

    Para atualizar posteriormente, basta executar git pull se você estiver usando git ou svn update se você estiver usando SVN.

  2. Atualize o setuptools e instale o 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
    

    Ou rode o script https://bootstrap.pypa.io/get-pip.py

  3. Instale o módulo do Django.

    O jeito mais fácil de instalar o Django é pelo pip. O seguinte comando baixa e instala direto do GitHub. Ainda evita ter que mexer muito no $PATH.

    juliobor@box780 ~  $  pip install git+https://github.com/django/django.git
    

    Alternativas:

    • Usar o pip, mas manter o diretório do controle de versão: sudo pip install -e ~/django/ (Mais fácil de manter atualizado com git pull)
    • Criar um arquivo .pth na pasta site-packages apontando para o diretório baixado pelo git/svn
    • Instalar usando setup.py install --user
  4. Edite novamente o “~/.bashrc” para:

    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. Teste se você consegue importar o 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 o protocolo FastCGI, devemos instalar o 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
    

Pronto, o Django está instalado. Podemos criar um projeto de teste para aprender as operações básicas e ver se tudo está funcionando corretamente.

Criação de um projeto

  • Crie um diretório de projetos em algum lugar que não seja acessível da Web (i.e., fora do ~/public_html). Eg.:

    juliobor@box780 ~  $  mkdir django_projects; cd django_projects
    
  • Crie um projeto dentro da sua pasta de projetos

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

    Se você não usou o pip, provavelmente precisará editar o $PATH para usar o django-admin.py como no comando acima:

    juliobor@box780 ~  $  export PATH=/home7/juliobor/django/django/bin:$PATH
    
  • Edite o arquivo settings.py com as configurações do seu banco de dados.

    'ENGINE': 'django.db.backends.sqlite3',
    'NAME': '/home7/juliobor/django_projects/mysite/testDB',
    

    O sqlite3 é bom para fins de teste, mas recomendo usar o PostgreSQL. Você precisará instalar o psycopg2:

    juliobor@box780 ~  $  pip install psycopg2
    

    Alternativa:

    juliobor@box780 ~  $  easy_install psycopg2
    
  • Execute o seguinte comando para criar as tabelas do banco de dados. Responda no se pedir para criar um usuário: juliobor@box780 ~/django_projects/juliobs $ python manage.py syncdb

  • Crie um arquivo .fcgi em ~/public_html (ou em um subdiretório se quiser)

    Edite o arquivo django.fcgi e torne-o executável:

    #!/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
    
  • Adicione um .htaccess

  • Se o Django estiver na raíz do site:

    AddHandler fcgid-script .fcgi 
    Options +SymLinksIfOwnerMatch
    RewriteEngine On 
    RewriteBase / 
    RewriteRule ^(media/.*)$ - [L] 
    RewriteCond %{REQUEST_URI} !(django.fcgi) 
    RewriteRule ^(.*)$ django.fcgi/$1 [L]
    
  • Se o site estiver em /django:

    ~/public_html/.htaccess

    AddHandler fcgid-script .fcgi
    Options +SymLinksIfOwnerMatch
    RewriteEngine On 
    RewriteBase / 
    RewriteRule ^(django\.fcgi/.*)$ - [L] 
    RewriteRule ^(.*)$ /django/django.fcgi/$1 [L]
    

Agora você pode seguir qualquer tutorial de Django. Eu estou aprendendo a maioria das coisas lendo o The Django Book (The Definitive Guide to Django), que possui essa Web preview, está bem atualizado e explica bem os conceitos.

Django + Apache + mod_wsgi

Por motivos óbvios eu não vou desenvolver direto no servidor em que meu site está hospedado, mas sim no meu próprio notebook. O Django possui um modo legal de testar o site sem precisar instalar um servidor, que é rodando o comando python2 manage.py runserver

O site deverá ser exibido em http://localhost:8000

Porém algumas coisas ficam mais complicadas de serem testadas dessa forma e, como eu já possuo o Apache instalado aqui, acho muito mais prático desenvolver e testar no meu Apache.

  1. Instale o django do git pelo pip:

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

    julio@julio-acer ~> sudo pacman -S mod_wsgi
    
  3. Edite o wsgi.py:

    import os
    import sys
    
    # Adiciona caminho do projeto e seu diretório pai ao sys.path (precisa para
    # import juliobs.settings). Também pode ser feito pelo httpd.conf com 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. Edite o 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. Você deverá conseguir acessar o site em http://localhost/django

Coloque seu site em controle de versão

Agora já temos tudo funcionando podemos iniciar o desenvolvimento do site. Vale lembrar que

Se você não quiser deixar o código do seu site em algum repositório como o GitHub, uma boa alternativa é o rsync

julio@julio-acer Web/django/django_projects> rsync -avze --delete ssh juliobs juliobor@juliobs.com:~/django_projects

Observações:

  • Erro ao criar super usuário:

    python manage.py createsuperuser
        return getpass.getuser().decode(locale.getdefaultlocale()[1])
    TypeError: decode() argument 1 must be string, not None
    

    resolvi definindo o locale:

    juliobor@box780 ~  $  export LANG=en_US.UTF-8
    
  • No Arch Linux o mod_wsgi é para o Python3, você precisa instalar o mod_wsgi2.


Julio Batista Silva
Julio Batista Silva
Data Engineer

I’m a computer engineer passionate about science, technology, photography, and languages. Currently working as a Data Engineer in Germany.

comments powered by Disqus