Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Arquivos Estáticos - Localização do diretório

Boa noite ,

gostaria de saber como funciona a lógica de importação de arquivos estáticos no Django. Pergunto porque na aula 10 é criada uma nova app, 'usuarios'. Apesar do diretório static estar dentro da app 'perfis', as páginas da app 'usuarios' encontram os arquivos estáticos do bootstrap que estão em outra app. A pasta 'static' pode estar em qualquer nível da estrutura do projeto que será automaticamente carregada?

6 respostas

Oi Lauro, vi sua pergunta. Estou no celular, em 10 minutos chego no comp e te respondo! Me espera viu!

Não pode estar em qualquer nível, tem que ser filha direta do diretório da aplicação. É por isso que perfis e usuarios, cada um tem a pasta static. Essa é uma convenção do Django que deve ser seguida.

Porém, como você viu no curso, para podermos acessar os arquivos dentro das páginas static precisamos usar {% static "nome_do_arquivio" %}" e também usar {% load staticfiles %}.

Sua pergunta foi muito boa é para uma pergunta boa assim tem um plus :). Segue uma dica, de algo que não falei no treinamento, porque não havia necessidade naquele projeto, mas pode acontecer de um dia você se deparar com essa situação:

O que aconteceria se tivéssemos a seguinte estrutura:

connectedin
   perfis
       static 
          styles
            a.css
  usuarios
      static 
         styles
           a.css

Consegue ver o problema? Os dois projetos tem dentro do diretório static a pasta styles com mesmo arquivo. Mas suponha que o conteúdo de perfis/static/styles/a.css seja um e perfis/static/styles/a.css seja outro. Como faremos para carregar um ou outro arquivo, se tudo está dentro de static? Pegou o problema?

Para resolver, basta mudar um pouquinho a estrutura dos diretórios que ficará assim:

connectedin
   perfis
       static
         perfis
             styles
                 a.css
  usuarios
      static
            usuarios 
                styles
                     a.css

Veja que dentro do diretório static de cada projeto adicionei uma subdiretório com o mesmo nome do projeto. Parece redundante, mas isso resolve o problema de carregarmos dois arquivos com o mesmo nome em projetos diferentes.

Agora, na hora de carregar um ou outro, fazermos assim:

<link href="{% static "perfis/a.css" %}" rel="stylesheet">
<link href="{% static "usuarios/a.css" %}" rel="stylesheet">

Bom, consegui tirar a sua dúvida? O plus que dei, valeu a pena?

Flávio, agradeço a sua resposta. Certamente foi bastante esclarecedora e a dica valeu muito a pena. Mas confesso que fiquei um pouco confuso, porque a minha 'usuarios' não tem a pasta static e funcionou. Fui procurar um pouco na documentação do Django e achei o seguinte. No INSTALLED_APPS do projeto tem lá o django.contrib.staticfiles (https://docs.djangoproject.com/en/1.8/howto/static-files/). Existe uma configuração, chamada 'STATICFILES_FINDERS'( https://docs.djangoproject.com/en/1.8/ref/settings/#std:setting-STATICFILES_FINDERS), que por default vem com duas opções:

("django.contrib.staticfiles.finders.FileSystemFinder", "django.contrib.staticfiles.finders.AppDirectoriesFinder")

Repare que na explicação em (https://docs.djangoproject.com/en/1.8/ref/settings/#std:setting-STATICFILES_FINDERS):

The default will find files stored in the STATICFILES_DIRS setting (using django.contrib.staticfiles.finders.FileSystemFinder) and in a static subdirectory of each app (using django.contrib.staticfiles.finders.AppDirectoriesFinder). If multiple files with the same name are present, the first file that is found will be used. Portanto, quando este finder AppDirectoriesFinder está configurado, ele pega o primeiro que encontra. Como eu estava com o diretorio static dentro de 'perfis', a 'usuarios' utilizou os arquivos estáticos de 'perfis'. Enfim, posso estar falando besteira, mas se você perceber, na aula 11, você também não tem o diretório static dentro de 'usuarios' (basta ver a estrutura de diretórios no editor de texto), e assim como eu, também deve estar utilizando a static de perfis. A sua certamente ainda é válida para o caso de termos arquivos estáticos com o mesmo nome, mas com conteúdos distintos. Um abraço e parabéns pelo curso, você tem excelente didática e as aulas são muito boas.

solução!

Opa, valeu pelo feedback, mas vamos deixar essa dúvida zerada.

Vou me basear no texto que você colocou da documentação. Nele está assim:

"If multiple files with the same name are present, the first file that is found will be used"

Foi isso que expliquei na mensagem anterior. Quando AppDirectoriesFinder está configurado, ele não pega o primeiro diretorio que encontra, ele pega todos os diretórios static de todas as aplicações. O que ele pega o primeiro que encontra, é quando em diferentes pastas statics temos arquivos de mesmo nome (aquele problema que eu mostrei para você na mensagem anterior).

Pense que tudo que está em static é visível para todas as aplicações. Se eu tenho 10 aplicações com 10 pastas static, todos os arquivos serão acessíveis para todas as aplicações. É por isso que usuários pegou carona no arquivo da pasta staticde perfis.

O problema é quando temos mais de uma pasta static com arquivos de mesmo nome, daí, como a documentação diz, ele pega o primeiro. Como resolver? É o lance da subpasta que eu expliquei na mensagem anterior.

Se ainda ficou com dúvida, não se acanhe, só me dizer que a gente vai aparando as arestas.

Abraço e aguardo seu feedback.

Tudo esclarecido. Obrigado!

Esclarecido mesmo, eu eu te ganhei no cansaço? :)

Qualquer coisa poste aqui no fórum que eu farejo e respondo :)

Abraço e bom estudo!