files estaticos carga archivos python django

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

Chrome Borrar caché y cookies

¿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 en settings.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 en settings.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.