Django no Bluehost

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

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á incluso 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 raiz 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
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