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á 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
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.
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.tgzVá à 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 installSe 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. >>>Edite seu
~/.bashrcpara exportar a variávelPATHsempre que o Bash iniciar (a ordem importa):export PATH=$HOME/bin:$PATHjuliobor@box780 ~ $ echo $PATH /home7/juliobor/bin:/usr/lib64/qt-3.3/bin:/home7/juliobor/perl5/bin:/usr/kerberos/bin:/ramdisk/bin:/usr/bin:/binRode 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. >>>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
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 pullse você estiver usando git ousvn updatese você estiver usando SVN.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.eggjuliobor@box780 ~ $ easy_install pipOu rode o script https://bootstrap.pypa.io/get-pip.py
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.gitAlternativas:
- Usar o pip, mas manter o diretório do controle de versão:
sudo pip install -e ~/django/(Mais fácil de manter atualizado comgit pull) - Criar um arquivo .pth na pasta site-packages apontando para o diretório baixado pelo git/svn
- Instalar usando
setup.py install --user
- Usar o pip, mas manter o diretório do controle de versão:
Edite novamente o “~/.bashrc” para:
export PATH=$HOME/bin:$HOME/.local/bin:$PATHjuliobor@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:/binTeste 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.5Para usar o protocolo FastCGI, devemos instalar o Flup:
juliobor@box780 ~ $ pip install flupAlternativa:
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_projectsCrie um projeto dentro da sua pasta de projetos
juliobor@box780 ~/django_projects $ django-admin.py startproject juliobsSe 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:$PATHEdite o arquivo
settings.pycom 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 psycopg2Alternativa:
juliobor@box780 ~ $ easy_install psycopg2Execute 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
.fcgiem~/public_html(ou em um subdiretório se quiser)Edite o arquivo
django.fcgie 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.fcgiAdicione um
.htaccessSe 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/.htaccessAddHandler 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.
Instale o django do git pelo pip:
julio@julio-acer ~> sudo pip2 install git+https://github.com/django/django.gitInstale o
mod_wsgi:julio@julio-acer ~> sudo pacman -S mod_wsgiEdite 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()Edite o
http.confLoadModule 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>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 Noneresolvi definindo o locale:
juliobor@box780 ~ $ export LANG=en_US.UTF-8No Arch Linux o
mod_wsgié para o Python3, você precisa instalar omod_wsgi2.
Links
- https://docs.djangoproject.com/en/dev/howto/deployment/fastcgi/
- http://alextreppass.co.uk/getting-django-working-on-bluehost
- http://blog.ruedaminute.com/2011/01/2011-installation-instructions-for-django-on-bluehost/
- http://www.techgeekguy.com/2011/01/how-to-install-python-svn-django-osqa-web-hosting-server-hostmonster-dreamhost-bluehost-godaddy-hostgator/
- https://my.bluehost.com/cgi/help/000585

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