有没有一种简单的方法可以关闭Django开发服务器中的静态文件缓存?
我正在使用标准命令启动服务器:
$ python manage.py runserver
我已经settings.py
配置为从/static
我的Django项目目录中提供静态文件.我还有一个中间件类,它将Cache-Control
头设置must-revalidate, no-cache
为开发,但这似乎只会影响不在我的/static
目录中的URL .
@Erik Forsberg的回答对我有用.这就是我必须做的事情:
从应用注释掉staticfiles INSTALLED_APPS
在settings.py
:
INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', #'django.contrib.staticfiles', )
将我的STATIC_URL
变量设置为settings.py
:
STATIC_URL = '/static/'
在项目的基础上添加一个条目urls.py
:
# static files w/ no-cache headers url(r'^static/(?P.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_ROOT}),
请注意,我还在Cache-Control
中间件类中设置标头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
然后将其包含在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', )
Django的contrib.staticfiles
应用程序通过覆盖runserver
命令自动为您提供静态文件.使用此配置,您无法控制它为静态文件提供服务的方式.
您可以通过向--nostatic
runserver命令添加选项来阻止staticfiles应用程序提供静态文件:
./manage.py runserver --nostatic
然后你可以编写一个url配置来手动提供带有标头的静态文件,以阻止浏览器缓存响应:
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.*)$', never_cache(serve_static)), )
如果您希望manage.py runserver
命令--nostatic
默认启用该选项,则可以将其放入manage.py
:
if '--nostatic' not in sys.argv: sys.argv.append('--nostatic')
假设你正在使用django.views.static.serve
,它看起来不像 - 但是编写自己的视图只是调用django.views.static.serve
,添加Cache-Control标头应该相当容易.
我的简单解决方案:
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)