fcoelho/semcomp-next — pull request #47 by fcoelho (2014-06-25 06:57:42+00:00)
Title: arquivos css diferentes em prod/dev

durante o desenvolvimento, o site todo roda usando o comando runserver e
tudo é acessado na raiz, i.e., localhost:8000/. em produção, todas as
urls passam a ter um prefixo /17, incluindo os arquivos estáticos. O
problema disso é que os arquivos css incluem links pra alguns arquivos
estáticos, em especial as imagens, que se não estiverem no lugar certo
não vão ser carregadas.

em dev, uma imagem pode aparecer linkada como url(/img/imagem.png), mas
em produção ela tem que aparecer como url(/17/img/imagem.png), o que não
é muito fácil de fazer usando um único arquivo css. por isso, passa-se a
usar dois arquivos de css, um em dev e outro em produção. ambos são
compilados pelo compass+sass e tem a url das imagens acertada durante a
compilação, mantendo só um arquivo .scss original.

só que só gerar o segundo arquivo css não é o suficiente, é necessário
usá-lo de fato. todas as dependências estáticas do django (imagens,
javascript, css) são coletadas antes de o site entrar no ar usando o
comando collectstatic. esse comando inspeciona a configuração
STATICFILES_FINDERS pra descobrir como coletar os arquivos estáticos, e
a ordem dos _finders_ especificados nessa variável é importante:
primeiro está o FileSystem, depois o AppDirectories (e depois um de
outro app que não importa aqui). o AppDirectories coleta arquivos nas
pastas "static" dentro de cada aplicativo. o FileSystem usa uma outra
variável, o STATICFILES_DIRS pra saber quais diretórios devem ser
incluídos no resultado final. Como o FileSystem está antes do
AppDirectories, se algum arquivo tiver o mesmo nome para os dois, o
primeiro tem preferência.

assim, o arquivo website/static/production/css/app.css tem preferência
sobre o arquivo website/static/css/app.css, mas só em produção porque o
settings STATICFILES_DIRS não está definido para os outros ambientes.