Blog do Julio

Hacks, tutoriais e dicas

Django No Bluehost

| Comments

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:

~/public_html/django.fcgi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/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:

~/public_html/.htaccess
1
2
3
4
5
6
7
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
1
2
3
4
5
6
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:

wsgi.py
1
2
3
4
5
6
7
8
9
10
11
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

/etc/httpd/conf/httpd.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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 Archlinux o mod_wsgi é para o Python3, você precisa instalar o mod_wsgi2


Links:

Comments