Django no Bluehost

December 28, 2011   

Atualizado em 24 de maio de 2012.

No começo do 2o semestre (2011) 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

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

  4. 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: {% codeblock ~/public_html/django.fcgi lang:python %} #!/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”) {% endcodeblock %}

juliobor@box780 ~/public_html  $  chmod a+x django.fcgi
  • Adicione um .htaccess

  • Se o django estiver na raíz do site: {% codeblock ~/public_html/.htaccess %} AddHandler fcgid-script .fcgi Options +SymLinksIfOwnerMatch RewriteEngine On RewriteBase / RewriteRule ^(media/.)$ - [L] RewriteCond %{REQUEST_URI} !(django.fcgi) RewriteRule ^(.)$ django.fcgi/$1 [L] {% endcodeblock %}

  • Se o site estiver em /django: {% codeblock ~/public_html/.htaccess %} AddHandler fcgid-script .fcgi Options +SymLinksIfOwnerMatch RewriteEngine On RewriteBase / RewriteRule ^(django.fcgi/.)$ - [L] RewriteRule ^(.)$ /django/django.fcgi/$1 [L] {% endcodeblock %}

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: {% codeblock 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() {% endcodeblock %}

4. Edite o http.conf {% codeblock /etc/httpd/conf/httpd.conf lang:text%} 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/

Order deny,allow Allow from all

Alias /media/ /media/externo/Documentos/Programacao/Web/django_projects/juliobs/juliobs/media/ SetHandler None Order allow,deny Allow from all {% endcodeblock %}

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 Archlinux o mod_wsgi é para o Python3, você precisa instalar o mod_wsgi2



comments powered by Disqus