【问题标题】:Django - Disable Page Level Caching by UserDjango - 按用户禁用页面级缓存
【发布时间】:2017-05-31 12:04:10
【问题描述】:

我已经为我们的许多页面设置了页面级缓存。但是,有时管理员用户会登录以预览对站点的潜在更改。

有没有办法只为这些用户禁用页面级缓存?

我阅读了the docs,但我什么也没看到。

更新: 这是我基于 v1k45 的回答的尝试:

from django.middleware.cache import FetchFromCacheMiddleware


logger = logging.getLogger(__name__)


class ExceptImpersonateFetchFromCacheMiddleware(FetchFromCacheMiddleware):
    def process_request(self, request):
        # Break out of caching is we're using impersonate
        if request.user and hasattr(request.user, 'is_impersonate') and request.user.is_impersonate:
            logger.warning("Skipping cache_page for user %s because it is impersonation" % str(request.user))
            request._cache_update_cache = False
            return None
        # Normal flow:
        return super(ExceptImpersonateFetchFromCacheMiddleware, self).process_request(request)

【问题讨论】:

    标签: django caching django-cache django-caching


    【解决方案1】:

    您可以扩展 django 提供的 CacheMiddleware 以便管理员用户总是看到新鲜的内容而不是缓存。

    看看FetchFromCacheMiddleware的源码,可以看到这段代码sn-p:

    def process_request(self, request):
        [...]
        if request.method not in ('GET', 'HEAD'):
            request._cache_update_cache = False
            return None  # Don't bother checking the cache.
    

    这里的if条件告诉django跳过缓存,如果请求方法不是GET或者HEAD,就不要更新已有的缓存数据。

    同样,如果用户是管理员,您可以在跳过缓存的位置添加检查。大概是这样的:

    def process_request(self, request):
        [...snip..]
        if request.user.is_staff:
            request._cache_update_cache = False
            return None  # Don't bother checking the cache.
    

    更新cache_page 装饰器使用 django 的 CacheMiddleware,它扩展了 FetchFromCacheMiddleware 和 UpdateCacheMiddleware 的功能。

    现在您必须制作自己的 CacheMiddlewarecache_page 装饰器版本。这个custom_cache_page 装饰器将调用您的CustomCacheMiddleware,它扩展了您的CustomFetchFromCacheMiddleware 和django 的UpdateCacheMiddleware

    完成 CustomCacheMiddleware 后,您必须将 django 的 CacheMiddleware 替换为您自己的。这可以通过更改 settings.py 中的 MIDDLEWARE_CLASSES 元组来完成。

    【讨论】:

    • 这看起来很有希望!谢谢!最好的方法是什么?我是在修改Django自己的源代码,还是有更聪明的方法?
    • 你不是在修改 django 的源代码,你只是在替换 django 提供的一个中间件,它可以随时替换。您所要做的就是将扩展类的 python 路径放入您的 settings.py MIDDLEWARE_CLASSES
    • 您是说将我的新类命名为“FetchFromCacheMiddleware”以覆盖 Django 的版本吗?我在 MIDDLEWARE_CLASSES 的 settings.py 中没有看到“FetchFromCacheMiddleware”。
    • (我也把我的代码放在问题中,看起来对吗)
    • 嗯,进一步阅读,FetchFromCacheMiddleware 仅用于整个站点的缓存,而不是 cache_page 装饰器?
    猜你喜欢
    • 2010-12-10
    • 2021-08-09
    • 2017-07-13
    • 2015-07-21
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多