Qual é o objetivo da estática coletiva do Django?

86

Esta é provavelmente uma pergunta estúpida, mas não está clicando na minha cabeça.

No Django, a convenção é colocar todos os seus arquivos estáticos (isto é, css, js) específicos do seu aplicativo em uma pasta chamada static . Portanto, a estrutura ficaria assim:

mysite/
    manage.py
    mysite/ --> (settings.py, etc)
    myapp/ --> (models.py, views.py, etc)
        static/

Em mysite/settings.pyeu tenho:

STATIC_ROOT = 'staticfiles'

Então, quando executo o comando:

python manage.py collectstatic   

Ele cria uma pasta chamada staticfilesno nível raiz (mesmo diretório que myapp/)

Qual é o objetivo disso? Não é apenas criar uma cópia de todos os meus arquivos estáticos?

Chris Tang
fonte

Respostas:

69

Colete arquivos estáticos de vários aplicativos em um único caminho

Bem, um único Django projeto podem usar vários aplicativos , por isso, enquanto lá você só tem um myapp, ele pode realmente ser myapp1, myapp2etc.

Ao copiá-los de dentro de aplicativos individuais em uma única pasta, você pode apontar seu servidor web front-end (por exemplo, nginx) para essa única pasta STATIC_ROOTe servir arquivos estáticos de um único local, em vez de configurar seu servidor web para servir arquivos estáticos de vários caminhos .

URLs persistentes com ManifestStaticFilesStorage

Uma observação sobre o hash MD5 sendo anexado ao nome do arquivo para controle de versão: Não faz parte do comportamento padrão do collectstatic, como settings.STATICFILES_STORAGEpadrão para StaticFilesStorage(que não faz isso)

O hash MD5 entrará em ação, por exemplo, se você configurá-lo para usar ManifestStaticFilesStorage, quais anúncios esse comportamento.

O objetivo desse armazenamento é continuar servindo os arquivos antigos no caso de algumas páginas ainda se referirem a esses arquivos, por exemplo, porque eles são armazenados em cache por você ou por um servidor proxy de terceiros. Além disso, é muito útil se você deseja aplicar cabeçalhos Expires em um futuro distante aos arquivos implantados para acelerar o tempo de carregamento para visitas de página subsequentes.

Bakkal
fonte
2
você quer dizer que será fácil encontrar o servidor web para servir o conteúdo estático
babygame0ver
44

Os arquivos estáticos do Django podem estar em muitos lugares. Um arquivo que é servido como/static/img/icon.png pode vir de vários lugares . Por padrão:

  • FileSystemFinder vai procurar por img/icon.png em cada um STATICFILES_DIRS,
  • AppDirectoriesFinder vai procurar por img/icon.png na staticsubpasta em cada um de seus INSTALLED_APPS. Isso permite que bibliotecas como Django Admin adicionem seus próprios arquivos estáticos ao seu aplicativo.

Agora: isso só funciona se você executar manage.py runservercom DEBUG = 1. Quando você entrar no ar, o processo Django não servirá mais os ativos estáticos. Seria ineficiente usar Django para atendê-los, existem ferramentas mais especializadas especificamente para isso.

Em vez disso, você deve fazer algo assim:

  • encontre todos os arquivos estáticos de cada aplicativo
  • construir um único diretório que contenha todos eles
  • carregue-os em algum lugar (a static diretório em algum lugar do seu servidor da web ou um armazenamento de arquivos de terceiros)
  • configure seu servidor web (como o nginx) para servir /static/*diretamente desse diretório e redirecionar quaisquer outras solicitações para Django.

collectstatic é um script pronto que prepara esse diretório para você, para que possa conectá-lo diretamente ao seu script de implantação.

Kos
fonte
25

Na instalação de produção, você deseja ter URLs persistentes. O URL não muda, a menos que o conteúdo do arquivo mude.

Isso evita que os clientes tenham a versão errada do arquivo CSS ou JS em seus computadores ao abrir uma página da web do Django. Django staticfiles detecta mudanças de arquivo e atualiza URLs de acordo, de forma que se o arquivo CSS ou JS mudar, o navegador da web baixe a nova versão.

Isso geralmente é obtido adicionando hash MD5 ao nome do arquivo durante a collectstaticexecução.

Editar: Veja também a resposta relacionada a vários aplicativos.

Mikko Ohtamaa
fonte
1
Um bom! não sabia
doador
"geralmente obtido adicionando hash MD5", você quer dizer ManifestStaticFilesStorage ? Legal, eu não vi isso
Kos
3
Acho que, por padrão, não há hashing MD5 acontecendo, já que o settings.STATICFILES_STORAGEpadrão é StaticFilesStorage, então o MD5 só será ativado depois que você, por exemplo, defini-lo como ManifestStaticFilesStorage, estou correto?
Bakkal
@MikkoOhtamaa Mas então como o aplicativo de front-end sabe a qual nome de arquivo ele deve vincular, já que o último sempre muda?
lapin de
@lapin Boa pergunta! Naturalmente, deve haver 1) mapeamento para as versões mais recentes e 2) maneira de comunicar isso. Normalmente é armazenado em um arquivo em algum lugar e, em seguida, quando você pergunta "qual URL completo da versão mais recente do X", ele fornece um resultado.
Mikko Ohtamaa
9

É útil quando há vários aplicativos django dentro do site.

collectstatic irá, então, coletar arquivos estáticos de todos os aplicativos em um único lugar - para que possa ser servido em um ambiente de produção.

aa333
fonte