Django仍使用@never_cache装饰器缓存视图

rav*_*shi 5 django memcached caching django-rest-framework

我正在将Django与Django Rest Framework和uWSGI一起使用。我已经在pylibmc后端的服务器上设置了memcached。我为每个站点缓存配置了Django,因此应该缓存每个视图,但我使用@never_cache装饰器将其除外。我不知道为什么即使添加了Django的@never_cache装饰器,Django仍然尝试缓存我的API视图。我有一个API,支持草稿模型的读写操作。当我使用UpdateAPIView进行草稿更新,然后刷新页面时,它仍显示更新前的草稿数据。我已经确认这不是浏览器端缓存,因为网络日志显示的响应为200,而不是304,并且如果我清除内存缓存并刷新页面,则可以正确返回更新的草稿。

这是最近发生的,当我将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)
Run Code Online (Sandbox Code Playgroud)

我也尝试过基于@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)
Run Code Online (Sandbox Code Playgroud)

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',
)
Run Code Online (Sandbox Code Playgroud)

我的请求标头中还设置了Cache-Control:max-age = 0。

Vla*_*lax 2

或许

@method_decorator(never_cache)
Run Code Online (Sandbox Code Playgroud)