Archive

Posts Tagged ‘django’

Criando um Makefile para Aplicações Django

July 28th, 2009 victor.pantoja No comments

Na empresa em que trabalho, criamos a excelente cultura de automatizar tudo que pode ser automatizado.

Nessa filosofia, apresento aqui a maneira que me parece bem interessante de rodar uma aplicação django:

$make runserver

Bem prático, não?

Tudo que fiz foi criar um makefile com a seguinte macro:

runserver:
        @echo "Running aplicacao seu_dominio:3001..."
        @export PYTHONPATH=`pwd`:`pwd`/dango_project:$$PYTHONPATH && \
                export DJANGO_SETTINGS_MODULE=dango_project.settings.dev && \
                cd dango_project && python manage.py runserver seu_dominio:3001

Explicando melhor, imagine que você criou o django project projetoTeste. Imagine agora que, dentro deste projeto, você criou um diretório settings contendo o arquivo dev.py (settings para ambiente de desenvolvimento: lembrando que o settings.py pode ter o nome que você quiser! Recomendo apenas que faça sentido).

Substitua em runserver a variável aplicacao pelo nome fantasia que você quer dar para o seu projeto e dango_project por projetoTeste.

runserver:
        @echo "Running minha aplicacao teste teste.com:3001..."
        @export PYTHONPATH=`pwd`:`pwd`/projetoTeste:$$PYTHONPATH && \
                export DJANGO_SETTINGS_MODULE=projetoTeste.settings.dev && \
                cd projetoTeste && python manage.py runserver seu_dominio:3001

Claro que o Makefile e o projetoTeste está no mesmo nível (mesmo diretório pai).

Existem diversas maneiras de se criar esse Makefile e não vou tomar o vosso tempo com isso.

O runserver é legal para aplicações locais. Para coisas sérias, recomendo o WSGI.

Categories: Web Developer Tags: , ,

Configurando o WSGI e o Apache para Renderizar Estáticos do Django

July 28th, 2009 victor.pantoja No comments

Levantei uma aplicação simples que usa o admin do django com algumas alterações de CSS e template. Crei um diretório /media no meu projeto para colocar os arquivos CSS que criei.

Tudo rodando muito bem com o tradicional runserver 3001 (costumo criar um make para isso).

Claro que chamar uma URL passando a porta fica, no mínimo, deselegante. Solução: usar mod_proxy, mod_python ou WSGI. Optei por este último por diversos motivos que fogem do escopo deste post.

Configuração feita, para minha surpresa o CSS não estava sendo encontrado… Tentei alterar as configurações do WSGI várias vezes, e nada. Acabei percebendo que o problema não era apenas com o CSS, mas como tudo que fosse estático (normalmente, dentro de /admin_media ou /media)

Depois de uma batalha de algumas horas com o WSGI e uma dica no grupo de discussão do Django, consegui configurá-lo para funcionar bem. O problema era basicamente o apache, que procurava o diretório de media em seu docroot.

A solução que escolhi está postada abaixo (preservei algumas informações e removi alguns tabs para caber na tela):

<VirtualHost *:80>
        ServerName seu_dominio_.com

ErrorLog "|/usr/sbin/cronolog /usr/local/logs/dir/apache/projeto_%Y%m%d_error.log"
CustomLog "|/usr/sbin/cronolog /usr/local/logs/dir/apache/projeto_%Y%m%d_access.log" combined

        DocumentRoot "/usr/local/django/projeto"

        Alias /media/ "/usr/local/django/path_deploy/projeto/media/"

        <Location "/media/">
                SetHandler None
                <LimitExcept GET>
                        Require valid-user
                </LimitExcept>

                Order Allow,Deny
                Allow from all
        </Location>

Alias /admin_media/ "/var/lib/python-support/python2.5/django/contrib/admin/media/"

        <Location "/admin_media/">
                SetHandler None
                <LimitExcept GET>
                        Require valid-user
                </LimitExcept>

                Order Allow,Deny
                Allow from all
        </Location>

        WSGIScriptReloading on
        WSGIScriptAlias / /usr/local/django/path_deploy/projeto/django.wsgi
        WSGIDaemonProcess nome_do_deamon user=usuario group=grupo processes=2 threads=25 stack-size=524288

        <Directory /usr/local/django/path_deploy/projeto>
                Order deny,allow
                Allow from all
        </Directory>

 </VirtualHost>

Claro que eu precisei criar um usuário para a aplicação. Sempre crio um usuário específico para cada aplicação que desenvolvo (boa prática).

Só uma observação: sempre que o apache receber uma requisição /media ou /admin_media ele irá tratar sozinho, sem repassar para a aplicação. Isso pode ser interessante para questões de carga na aplicação.

Categories: Web Developer Tags: , , ,