如果用户登录,Django会阻止缓存视图

vdb*_*oor 4 django http-caching

我的访问者从Varnish获得了该页面的缓存版本.我希望管理员用户一直看到该页面的当前版本.这样,所有更改都可以直接显示.

有这样的存在吗?我知道@never_cache装饰者.我正在寻找类似的东西,只有用户没有登录.

如果它适用于Django-CMS,则可获得奖励积分!

Mar*_*mro 8

我假设您正在使用缓存装饰器.下面的代码是一个装饰器,cache_page只有当用户不是管理员时才返回用另一个装饰器(即)装饰的视图.因此,admin将始终获取非装饰(非缓存)页面,而其他用户将获得装饰(因此可能是缓存)页面.它适用于所有可能的装饰器(不仅仅是cache_page).

def conditional_cache(decorator):
    """ Returns decorated view if user is not admin. Un-decorated otherwise """

    def _decorator(view):

        decorated_view = decorator(view)  # This holds the view with cache decorator

        def _view(request, *args, **kwargs):

            if request.user.is_staff:     # If user is staff
                return view(request, *args, **kwargs)  # view without @cache
            else:
                return decorated_view(request, *args, **kwargs) # view with @cache

        return _view

    return _decorator
Run Code Online (Sandbox Code Playgroud)

要使用它,而不是典型的语法:

@cache_page(123)
def testview(request):
    (...)
Run Code Online (Sandbox Code Playgroud)

使用:

@conditional_cache(decorator=cache_page(123))  # The argument is what you usually do with views, but without the @
def testview(request):
    (...)
Run Code Online (Sandbox Code Playgroud)


vdb*_*oor 3

我发现有这样的东西:

CACHE_MIDDLEWARE_ANONYMOUS_ONLY = True
Run Code Online (Sandbox Code Playgroud)

如果用户和工作人员之间没有区别,这应该适用于大多数网站。

要显式地向工作人员发送Cache-Control标头,可以编写一些中间件(Cookie遗憾的是,标头也有所不同)。

  • 此选项已被弃用并在当前 Django 版本中被删除。 (5认同)