我正在使用Django与Django Rest Framework和uWSGI。我在服务器上使用pylibmc后端设置了memcached。我为每个站点缓存配置了Django,因此每个视图都应该被缓存,除了那些我使用@never_cache装饰器免除它的视图。我无法弄清楚为什么Django仍在尝试缓存我的API视图,即使添加了Django的@never_cache装饰器。我有一个支持Draft模型的读写操作的API。当我使用UpdateAPIView进行草稿更新,然后刷新页面时,它仍然在更新之前显示草稿数据。我已经确认它不是浏览器端缓存,因为网络日志显示200响应,而不是304,如果我清除memcached并刷新页面,则会正确返回更新后的草稿。
最近发生的事情发生在我将Django从1.8升级到1.10,~15 pip包依赖项,OS发行版及其软件包时(因此很难准确找出导致它的原因)。
DRF检索API视图
from django.views.decorators.cache import never_cache
class DraftDetail(generics.RetrieveAPIView):
queryset = Draft.objects.all()
serializer_class = DraftSerializer
permission_classes = (permissions.IsAuthenticated, HasReadWriteAccess)
@never_cache
def dispatch(self, *args, **kwargs):
return super(DraftDetail, self).dispatch(*args, **kwargs)
我还尝试过基于@method_decorator的替代课程,但没有改变:
from django.views.decorators.cache import never_cache
from django.utils.decorators import method_decorator
@method_decorator(never_cache, name='dispatch')
class DraftDetail(generics.RetrieveAPIView):
queryset = Draft.objects.all()
serializer_class = DraftSerializer
permission_classes = (permissions.IsAuthenticated, HasReadWriteAccess)
settings.py
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
'LOCATION': '127.0.0.1:11211',
}
}
PYLIBMC_MIN_COMPRESS_LEN = 250
# The cache alias to use for storage.
CACHE_MIDDLEWARE_ALIAS = 'default'
# The number of seconds each page should be cached.
CACHE_MIDDLEWARE_SECONDS = 500
CACHE_MIDDLEWARE_KEY_PREFIX = 'app'
MIDDLEWARE_CLASSES = (
'django.middleware.cache.UpdateCacheMiddleware',
(...),
'django.middleware.cache.FetchFromCacheMiddleware',
)
我还在我的请求标头中设置了Cache-Control:max-age = 0。
答案 0 :(得分:0)
也许
@method_decorator(never_cache())