How to manage static files (e.g. images, JavaScript, CSS)¶
Sites geralmente precisam servir arquivos adicionais como imagens, JavaScript, ou CSS. No Django, nós nos referimos a estes arquivos como “arquivos estáticos”. O Django fornece django.contrib.staticfiles
para ajudar você a gerenciar eles.
Está página descreve como você pode servir estes arquivos estáticos.
Configurando arquivos estáticos¶
Certifique-se de que
django.contrib.staticfiles
está incluído no seuINSTALLED_APPS
.Em seu arquivo de configurações, defina
STATIC_URL
, por exemplo:STATIC_URL = "static/"
In your templates, use the
static
template tag to build the URL for the given relative path using the configuredstaticfiles
STORAGES
alias.{% load static %} <img src="{% static 'my_app/example.jpg' %}" alt="My image">
Armazene seus arquivos estáticos no diretório chamado
static
dentro da sua app. Por exemplomy_app/static/my_app/example.jpg
.
Servindo os arquivos
Além desses passos de configuração, você também vai precisar servir os arquivos estáticos.
Durante o desenvolvimento, se você usar django.contrib.staticfiles
, isso será feito automaticamente pelo runserver
quando DEBUG
está definido como True
(veja django.contrib.staticfiles.views.serve()
).
Este método é grosseiramente ineficiente e provavelmente inseguro, então isso é impróprio para produção.
Veja How to deploy static files para estratégias apropriadas para servir arquivos estáticos em ambientes de produção.
Seu projeto irá provavelmente ter ativos estáticos que não estão amarrados a uma app em particular. Além de usar um diretório static/
dentro de sua app, você pode definir uma lista de diretórios (STATICFILES_DIRS
) no seu arquivo de configurações onde o Django também irá procurar por arquivos estáticos. Por exemplo:
STATICFILES_DIRS = [
BASE_DIR / "static",
"/var/www/static/",
]
Veja a documentação para a definição do STATICFILES_FINDERS
para detalhes sobre como o staticfiles
encontra seus arquivos.
Namespacing de arquivos estáticos
Now we might be able to get away with putting our static files directly
in my_app/static/
(rather than creating another my_app
subdirectory), but it would actually be a bad idea. Django will use the
first static file it finds whose name matches, and if you had a static file
with the same name in a different application, Django would be unable to
distinguish between them. We need to be able to point Django at the right
one, and the best way to ensure this is by namespacing them. That is,
by putting those static files inside another directory named for the
application itself.
You can namespace static assets in STATICFILES_DIRS
by
specifying prefixes.
Servindo arquivos estáticos durante o desenvolvimento¶
Se você usa o django.contrib.staticfiles
como explicado acima, runserver
vai fazer isso automaticamente quando :settings:`DEBUG` estiver configurado como True
. Se você não tem django.contrib.staticfiles
em INSTALLED_APPS
, você ainda pode manualmente servir arquivos estáticos usando a view django.views.static.serve()
.
Isso não é apropriado para uso em produção! Para algumas estratégias de deploy, veja How to deploy static files.
For example, if your STATIC_URL
is defined as static/
, you can
do this by adding the following snippet to your urls.py
:
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
# ... the rest of your URLconf goes here ...
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
Nota
This helper function works only in debug mode and only if
the given prefix is local (e.g. static/
) and not a URL (e.g.
http://static.example.com/
).
Esta função de auxiliar serve somente o diretório atual STATIC_ROOT
; ela não faz a busca de arquivos estáticos como django.contrib.staticfiles
.
Finally, static files are served via a wrapper at the WSGI application layer. As a consequence, static files requests do not pass through the normal middleware chain.
Servindo arquivos que foram enviados pelo usuário durante o desenvolvimento¶
Durante o desenvolvimento, você pode entregar arquivos de mídia enviados pelos usuários através do MEDIA_ROOT
usando a view django.views.static.serve()
.
Isso não é apropriado para uso em produção! Para algumas estratégias de deploy, veja How to deploy static files.
For example, if your MEDIA_URL
is defined as media/
, you can do
this by adding the following snippet to your ROOT_URLCONF
:
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
# ... the rest of your URLconf goes here ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Nota
This helper function works only in debug mode and only if
the given prefix is local (e.g. media/
) and not a URL (e.g.
http://media.example.com/
).
Testando¶
Ao executar testes que usam requisições HTTP reais ao invés do cliente de teste embutido (isto é, quando se usa a LiveServerTestCase
do Django) o conteúdo estático precisa ser servido junto com o resto do conteúdo então o ambiente de teste reproduz o real tão fielmente quanto possível, mas LiveServeTestCase
tem somente funcionalidades de servidor muito básicas de arquivos: Ele não sabe sobre as funcionalidades de procura da aplicação staticfiles
e assume que o conteúdo estático já tenha sido coletado no STATIC_ROOT
.
Por causa disso, staticfiles
vem com sua própria django.contrib.staticfiles.testing.StaticLiveServerTestCase
, uma subclasse daquela que vem embutida que tem a habilidade de servir de maneira transparente todos os ativos durante a execução destes testes de uma maneira similar a que temos em tempo de desenvolvimento com DEBUG = True
, isto é, sem precisar coletá-los usando o collectstatic
antes.
Deploy¶
django.contrib.staticfiles
fornece um comando de gerenciamento conveniente para juntar arquivos estáticos em um único diretório para você poder servi-los facilmente.
Defina a configuração do
STATIC_ROOT
para o diretório do qual você gostaria de servir estes arquivos, por exemplo:STATIC_ROOT = "/var/www/example.com/static/"
Run the
collectstatic
management command:$ python manage.py collectstatic
Isso irá copiar todos os arquivos dos seus diretórios estáticos para dentro do diretório definido em
STATIC_ROOT
.Use um servidor Web de sua escolha para servir os arquivos. O How to deploy static files cobre algumas estratégias de deploy comuns para arquivos estáticos.
Aprenda mais¶
Este documento cobriu o básico e alguns padrões comuns de uso. Para detalhes completos sobre todas as configurações, comandos, tags de templates, e outras partes incluidas em django.contrib.staticfiles
, veja a referência de arquivos estáticos.