Estou confuso static root
e quero esclarecer as coisas.
Para servir arquivos estáticos no Django, o seguinte deve estar em settings.py
e 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.py
seguintes 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:
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.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.
django
django-urls
django-staticfiles
user993563
fonte
fonte
if settings.DEBUG:
django não é muito bom para servir mídia estática; isso deve ser deixado para um servidor da web real.Respostas:
STATIC_ROOT
agora o comando
./manage.py collectstatic
irá 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
Se você definir
STATIC_URL = 'http://static.example.com/'
, então você deve servir aSTATIC_ROOT
pasta (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:
que renderizará:
fonte
{{ STATIC_URL }}jquery.js
e{% 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}}
static
método em vez deSTATIC_URL
método, e o bug se foi. Bom apelo às sugestões baseadas em versões.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 fizermanage.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.
ou
-------- End Edit -----------------
STATIC_URL
: '/ static /' geralmente é bom, é apenas um prefixo para arquivos estáticos.fonte
STATICFILES_DIRS
deve 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 especificarSTATICFILES_DIRS
.settings.py
(executandoSTATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
) antes de executar o comando collectstatic .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>/static
e 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 /'
fonte