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.tgz
-
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. >>>
-
Edite seu
~/.bashrc
para exportar a variávelPATH
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
-
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. >>>
-
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 pull
se você estiver usando git ousvn update
se 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.egg
juliobor@box780 ~ $ easy_install pip
Ou 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.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 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:$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
-
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
-
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.
-
Instale o django do git pelo pip:
julio@julio-acer ~> sudo pip2 install git+https://github.com/django/django.git
-
Instale o
mod_wsgi
:julio@julio-acer ~> sudo pacman -S mod_wsgi
-
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()
-
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>
-
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 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