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
.
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.
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
danssettings.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
variablesettings.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',
)
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')
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)
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
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.