Diferença entre STATIC_URL estático e STATIC_ROOT no Django

127

Estou confuso static roote quero esclarecer as coisas.

Para servir arquivos estáticos no Django, o seguinte deve estar em settings.pye urls.py:

import os
PROJECT_DIR=os.path.dirname(__file__)

1. Caminho absoluto para o diretório em que os arquivos estáticos devem ser coletados

STATIC_ROOT= os.path.join(PROJECT_DIR,'static_media/')

2. Prefixo da URL para arquivos estáticos

STATIC_URL = '/static/'

3. Locais adicionais para arquivos estáticos

STATICFILES_DIRS = ( os.path.join(PROJECT_DIR,'static/'),)

... e nas urls.pyseguintes linhas:

from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += patterns('', (
    r'^static/(?P<path>.*)$',
    'django.views.static.serve',
    {'document_root': settings.STATIC_ROOT}
))

4. Nós também usamos python manage.py collectstatic

Questões:

  1. Alguém poderia me explicar o fluxo de trabalho: como as coisas devem ser feitas idealmente. A partir de agora, copio / colo os trechos de código acima nos locais designados e continuo criando novos arquivos no diretório estático e ele funciona. No meu settings.STATIC_ROOT, no entanto, apontei para um diretório diferente.

  2. Seria ótimo se alguém pudesse explicar o fluxo de trabalho de cada configuração: como os arquivos são coletados e gerenciados e qual seria uma boa prática a seguir.

Obrigado.

user993563
fonte
Você poderia esclarecer o que você quer dizer com 'explicar o fluxo de trabalho'? também seus padrões de URL devem ser condicionais se você estiver desenvolvendo na parte 3. você pode fazer isso adicionando if settings.DEBUG:django não é muito bom para servir mídia estática; isso deve ser deixado para um servidor da web real.
dm03514
Oi @ user993563 Eu não consigo encontrar a solução em vários fóruns o que eu quero. mas suas perguntas explicar claramente graças homem ... grande trabalho ...
Mohideen bin Mohammed
Boa Explicação, Obrigado
Ajay Kumar 04/03

Respostas:

89

STATIC_ROOT

O caminho absoluto para o diretório em que ./manage.py collectstaticirá coletar arquivos estáticos para implantação. Exemplo:STATIC_ROOT="/var/www/example.com/static/"

agora o comando ./manage.py collectstaticirá copiar todos os arquivos estáticos (ou seja, em pasta estática em seus aplicativos, arquivos estáticos em todos os caminhos) para o diretório /var/www/example.com/static/. agora você só precisa servir esse diretório no apache ou nginx..etc.

STATIC_URL

Dos URLquais os arquivos estáticos no STATIC_ROOTdiretório são servidos (pelo Apache ou nginx..etc). Exemplo: /static/ouhttp://static.example.com/

Se você definir STATIC_URL = 'http://static.example.com/', então você deve servir a STATIC_ROOTpasta (ou seja "/var/www/example.com/static/") pelo Apache ou nginx na url 'http://static.example.com/'(de modo que você pode consultar o arquivo estático '/var/www/example.com/static/jquery.js'com 'http://static.example.com/jquery.js')

Agora em seus django-templates, você pode consultá-lo por:

{% load static %}
<script src="{% static "jquery.js" %}"></script>

que renderizará:

<script src="http://static.example.com/jquery.js"></script>
suhailvs
fonte
1
Qual é a dfference entre o seu exemplo e este: href = "{% estática "jquery.js" %}"
Utilizador
8
@macdonjo ambos {{ STATIC_URL }}jquery.jse {% static "jquery.js" %}são iguais. ou seja, ambos retornarão /static/jquery.js. Versões mais recentes do django recomendam o uso {% static "jquery.js" %}, mas você precisa carregar o tag de modelo, ie {% load staticfiles %}. na versão mais antiga do django recomenda{{STATIC_URL}}
suhailvs
Entendo. Eu estava tentando encontrar um bug que fazia com que a maioria dos meus modelos carregasse minha folha de estilo, exceto uma página. Eu mudei para staticmétodo em vez de STATIC_URLmétodo, e o bug se foi. Bom apelo às sugestões baseadas em versões.
Utilizador
37

STATICFILES_DIRS: Você pode manter os arquivos estáticos do seu projeto aqui, por exemplo, os usados ​​pelos seus modelos.

STATIC_ROOT: deixe em branco, quando o fizer manage.py collectstatic, ele procurará todos os arquivos estáticos no seu sistema e os moverá para cá. Seu servidor de arquivos estático deve ser mapeado para esta pasta onde quer que esteja localizado. Verifique depois de executar o collectstatic e você encontrará a estrutura de diretórios que o django criou.

--------Editar----------------

Como apontado por @DarkCygnus, STATIC_ROOT deve apontar para um diretório em seu sistema de arquivos, a pasta deve estar vazia, pois será preenchida pelo Django.

STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

ou

STATIC_ROOT = '/opt/web/project/static_files'

-------- End Edit -----------------

STATIC_URL: '/ static /' geralmente é bom, é apenas um prefixo para arquivos estáticos.

keni
fonte
2
Aqui, o link para o gerenciamento de arquivos estáticos em 1,3 docs.djangoproject.com/en/1.3/howto/static-files
keni
2
STATICFILES_DIRSdeve servir como diretórios adicionais para arquivos estáticos. Se você colocar todas as suas css / js / images na pasta APP_NAME / static / APP_NAME, não será necessário especificar STATICFILES_DIRS.
precisa saber é o seguinte
Obrigado pela resposta, sobre como deixar vazio o STATIC_ROOT, na verdade, tive que especificá-lo settings.py(executando STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')) antes de executar o comando collectstatic .
precisa saber é o seguinte
Hmm, posso ver com que facilidade isso pode ser enganador. O que quero dizer com deixá-lo vazio é que geralmente ele começa vazio, sem arquivos. Vou atualizar a resposta para remover a confusão.
Keni
2

Todas as respostas acima são úteis, mas nenhuma resolveu o meu problema. No meu arquivo de produção, meu STATIC_URL era https://<URL>/statice eu usei o mesmo STATIC_URL no meu arquivo dev settings.py.

Isso causa uma falha silenciosa no django / conf / urls / static.py.

O teste elif not settings.DEBUG or '://' in prefix: seleciona '//' no URL e não adiciona o padrão de URL estático, fazendo com que nenhum arquivo estático seja encontrado.

Seria bom se o Django cuspisse uma mensagem de erro informando que você não pode usar um http(s)://comDEBUG = True

Eu tive que mudar STATIC_URL para ser '/ static /'

MIkee
fonte