Servindo seus arquivos estáticos no Django1.3
Para quem já tentou fazer a migração, existe um número razoável de diferenças entre as versões do Django 1.2 e 1.3 . Algumas muito sutis, até. Tenho notado em listas de discussão, como a django-brasil, que algumas dúvidas são recorrentes. Dentre elas, a que me chama mais atenção é a confusão dentre os desenvolvedores com relação aos arquivos estáticos servidos em ambiente de desenvolvimento e a nova função do MEDIA_ROOT e MEDIA_URL. Bem, a ideia desta postagem é esclarecer um pouco disso tudo!
Antes do Django1.3
Até a versão 1.2 do Django, servir os arquivos estáticos do django em ambiente de desenvolvimento era algo mais ou menos assim:
- Primeiro você configura as variáveis MEDIA_ROOT e MEDIA_URL no seu settings.py
- Depois você configura no urls.py do projeto para que arquivos disponíveis no caminho definido em MEDIA_ROOT sejam servidos através da view django.views.static.server. (veja o seguinte exemplo)
Certo, mas o que isso faz? Basicamente, esta configuração faz com que seu projeto sirva os arquivos estáticos (css, js, img) utilizando uma view do django, o que é muito útil caso você queira trabalhar apenas com o servidor interno do django enquanto desenvolve. Mas, por que isso não mais funciona no Django1.3?
No Django1.3
A partir da versão 1.3 do framework web Django, as variáveis MEDIA_URL e MEDIA_ROOT mudaram seu significado para o projeto. Antes, responsáveis por designar o path de acesso a arquivos estáticos do projeto e o caminho para os arquivos estáticos do projeto, respectivamente, agora elas servem para designar o path de acesso aos arquivos enviados por usuários e o caminho para os arquivos enviados pelo usuário salvos no sistema.
Em miúdos, isso quer dizer que o seu css, js, img e o que for, arquivos necessários para o projeto, não mais ficarão misturados (preferencialmente) no mesmo diretório dos arquivos enviados por usuários (ex: FileField). Vantagens como organização são bastante visíveis aqui, mas, como os arquivos estáticos do projeto são servidos agora?
Servindo Arquivos Estáticos: The New Way!
Por se tratar de algo tão comum, servir arquivos estáticos do qual o projeto ou algum aplicativo dependa, os arquivos estáticos agora são servidos automaticamente pelo seu projeto (apenas em ambiente de desenvolvimento!). Legal, não é? Mas como isso funciona?
Ao adicionar qualquer aplicativo ao seu projeto, caso este aplicativo tenha uma pasta chamada static/ em sua raiz, esta pasta será automaticamente servida pelo seu projeto pelo caminho STATIC_URL configurado no seu settings.py.
A segunda forma de adicionar arquivos estáticos ao seu projeto é através do mapeamento de diretórios através da variável STATICFILES_DIRS do seu settings.py. Todos os diretórios apontados nesta variável serão servidos pelo seu STATIC_URL.
Por último, um aviso para um erro bastante comum relacionado aos arquivos estáticos no Django1.3: o diretório apontado pela variável STATIC_ROOT NÃO será servido pelo seu projeto em ambiente de desenvolvimento. Isso quer dizer que esta pasta deve estar vazia. Isto ocorre para que, em ambiente de produção, o desenvolvedor não se confunda e acabe servindo arquivos estáticos do projeto através de uma view do django, o que é inseguro e LENTO! [editado]
Falando em ambiente de produção, para que seus arquivos estáticos sejam servidos em ambiente de produção, você deve servir o diretório apontado pela variável STATIC_ROOT, através do seu servidor http. Isso é informação trivial amplamente documentada, mas, a grande sacada aqui é que o diretório apontado por STATIC_ROOT, pelo que foi dito acima, é para estar vazio, correto? Mais ou menos. Em ambiente de produção, você deve povoar este diretório com todos os seus arquivos estáticos. Obviamente você não fará isso manualmente. O seguinte comando faz o trabalho para você:
./manage.py collectstatic
O que este comando faz? Ele procura todos os arquivos estáticos que são servidos em ambiente de desenvolvimento (arquivos em app/static/ e em diretórios apontados por STATICFILES_DIRS) e os copia (ou linka!) para o local configurado em STATIC_ROOT. Muito útil e fácil.
Vale lembrar, como nota de rodapé, que sempre que você modificar os arquivos estáticos do projeto, você deve rodar o commando collectstatic novamente. Nada que um script fabric não resolva ;)
E o MEDIA_URL/MEDIA_ROOT?
Os arquivos presentes no caminho MEDIA_ROOT ainda terá que ser servido manualmente através de edição do urls.py do seu projeto, mas a boa notícia é que o script que antes servia para servir arquivos estáticos e enviados pelo usuário agora pode ser utilizado para servir arquivos enviados pelo usuário em ambiente de desenvolvimento, tranquilamente!
Bem, é isto! Bom desenvolvimento a todos = ]