Désactiver la mise en cache des fichiers statiques dans le serveur de développement Django

y a-t-il un moyen facile de désactiver la mise en cache des fichiers statiques dans le serveur de développement de Django?

je démarre le serveur avec la commande standard:

$ python manage.py runserver

j'ai settings.py configuré pour servir des fichiers statiques du répertoire /static de mon projet Django. J'ai aussi une classe middleware qui définit l'en-tête Cache-Control à must-revalidate, no-cache pour le développement, mais cela ne semble affecter URLs qui ne sont pas dans mon répertoire /static .

25
demandé sur aaronstacy 2011-08-10 19:47:03

6 réponses

en supposant que vous utilisez django.views.static.serve , cela n'en a pas l'air - mais écrire votre propre vue qui appelle simplement django.views.static.serve , ajouter l'en-tête Cache-Control devrait être assez facile.

7
répondu Erik Forsberg 2011-08-10 17:11:02

la réponse de @Erik Forsberg a fonctionné pour moi. Voici ce que je devais faire:

  • Commentaire de la staticfiles application à partir de INSTALLED_APPS dans settings.py :

    INSTALLED_APPS = (
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.sites',
        'django.contrib.messages',
        #'django.contrib.staticfiles',
    )
    
  • Laissez mon STATIC_URL variable settings.py :

    STATIC_URL = '/static/'
    
  • ajouter une entrée à la base de mon projet urls.py :

    # static files w/ no-cache headers
    url(r'^static/(?P<path>.*)$', 'django.views.static.serve',
        {'document_root': settings.STATIC_ROOT}),
    

Notez que je suis aussi à la définition de la Cache-Control en-têtes dans un middleware de classe 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

et y compris celle de 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',
    )
18
répondu aaronstacy 2013-11-08 00:04:14

L'application contrib.staticfiles de Django sert automatiquement les fichiers statiques pour vous en supplantant la commande runserver . Avec cette configuration, vous ne pouvez pas contrôler la façon dont elle sert les fichiers statiques.

vous pouvez empêcher l'application staticfiles de servir les fichiers statiques en ajoutant l'option --nostatic à la commande runserver:

./manage.py runserver --nostatic

alors vous pouvez écrire une configuration d'url pour servir manuellement les fichiers statiques avec des en-têtes qui empêchent le navigateur de cacher la réponse:

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 vous voulez que votre commande manage.py runserver ait l'option --nostatic par défaut, vous pouvez la mettre dans votre manage.py :

if '--nostatic' not in sys.argv:
    sys.argv.append('--nostatic')
13
répondu gitaarik 2018-03-17 08:16:56

ma solution très 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)
8
répondu Vladislav 2012-12-11 08:49:39

pour les nouveaux Django, la façon dont les classes middleware sont écrites a un peu changé.

suivez toutes les instructions de @aaronstacy ci-dessus, mais pour la classe middleware, utilisez ceci:

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
1
répondu Clayton Gulick 2018-08-29 19:00:18

cela n'a rien à voir avec Django, car rien n'a changé après que J'ai réinstallé Django avec pip.

c'est le comportement du navigateur, donc vous avez juste besoin de nettoyer les fichiers images en cache de votre navigateur.

Ref

Chrome " vider le cache et les cookies

0
répondu Simin Jie 2017-12-21 13:53:49