python - estaticos - Desactivar el almacenamiento en caché de archivos estáticos en el servidor de desarrollo Django
django styles (6)
Esto no tiene nada con Django, porque nada cambió después de que reinstalé Django usando pip.
Este es el comportamiento del navegador, por lo que solo necesita borrar los archivos de imágenes en caché de su navegador.
Árbitro
¿Hay una manera fácil de desactivar el almacenamiento en caché de archivos estáticos en el servidor de desarrollo de Django?
Estoy iniciando el servidor con el comando estándar:
$ python manage.py runserver
Tengo settings.py
configurado para servir archivos estáticos desde el directorio /static
de mi proyecto Django. También tengo una clase de middleware que establece el encabezado de Cache-Control
en must-revalidate, no-cache
para el desarrollo, pero eso solo parece afectar a las URL que no están en mi directorio /static
.
La aplicación contrib.staticfiles
de Django sirve automáticamente los archivos estáticos al anular el comando runserver
. Con esta configuración no puede controlar la forma en que sirve los archivos estáticos.
Puede evitar que la aplicación staticfiles sirva los archivos estáticos agregando la opción --nostatic al comando runserver:
./manage.py runserver --nostatic
Luego, puede escribir una configuración de url para servir manualmente los archivos estáticos con encabezados que impiden que el navegador almacene en caché la respuesta:
from django.conf import settings
from django.contrib.staticfiles.views import serve as serve_static
from django.views.decorators.cache import never_cache
urlpatterns = patterns('''', )
if settings.DEBUG:
urlpatterns += patterns('''',
url(r''^static/(?P<path>.*)$'', never_cache(serve_static)),
)
Si desea que su comando manage.py runserver
tenga --nostatic
opción --nostatic
de forma predeterminada, puede poner esto en su manage.py
:
if ''--nostatic'' not in sys.argv:
sys.argv.append(''--nostatic'')
La respuesta de @Erik Forsberg funcionó para mí. Esto es lo que tenía que hacer:
Comente la aplicación staticfiles desde
INSTALLED_APPS
ensettings.py
:INSTALLED_APPS = ( ''django.contrib.auth'', ''django.contrib.contenttypes'', ''django.contrib.sessions'', ''django.contrib.sites'', ''django.contrib.messages'', #''django.contrib.staticfiles'', )
Deje mi variable
STATIC_URL
establecida ensettings.py
:STATIC_URL = ''/static/''
Añadir una entrada a la base
urls.py
mi proyecto:# static files w/ no-cache headers url(r''^static/(?P<path>.*)$'', ''django.views.static.serve'', {''document_root'': settings.STATIC_ROOT}),
Tenga en cuenta que también estoy configurando los encabezados de Cache-Control
en una clase de middleware nocache.py
:
class NoCache(object):
def process_response(self, request, response):
"""
set the "Cache-Control" header to "must-revalidate, no-cache"
"""
if request.path.startswith(''/static/''):
response[''Cache-Control''] = ''must-revalidate, no-cache''
return response
Y luego incluir eso en settings.py
:
if DEBUG:
MIDDLEWARE_CLASSES = (
''django.middleware.common.CommonMiddleware'',
''django.contrib.sessions.middleware.SessionMiddleware'',
''django.middleware.csrf.CsrfViewMiddleware'',
''django.contrib.auth.middleware.AuthenticationMiddleware'',
''django.contrib.messages.middleware.MessageMiddleware'',
''nocache.NoCache'',
)
Mi solución muy simple:
from django.contrib.staticfiles.views import serve
from django.views.decorators.cache import never_cache
static_view = never_cache(serve)
urlpatterns += static_view(settings.MEDIA_URL,
document_root=settings.MEDIA_ROOT)
Para Django más reciente, la forma en que se escriben las clases de middleware ha cambiado un poco.
Siga todas las instrucciones de @aaronstacy anteriores, pero para la clase de middleware, use esto:
class NoCache(object):
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
response = self.get_response(request)
response[''Cache-Control''] = ''must-revalidate, no-cache''
return response
Suponiendo que está utilizando django.views.static.serve
, no lo parece, pero escribir su propia vista que solo llame a django.views.static.serve
, agregar el encabezado Cache-Control debería ser bastante fácil.