Configurando o WSGI e o Apache para Renderizar Estáticos do Django
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.