了解 Django 的缓存框架如何工作并处理不同用户角色的缓存页面

Understanding how Django's cache framework works and dealing with cached pages for different user roles

我遇到了一个问题,即无法为特定用户角色正确显示页面,我确信问题出在缓存上。该页面是加载了 AJAX:

的运动时间表的部分视图
url(pattern, cache_page(CACHE_TIMEOUT)(last_modified(season_modified(dont_vary_on("Cookie")(ScheduleView.as_view()))), name='schedule_partial')

请注意,season_modified 是一个返回上次修改 season/schedule 的函数。用于刷新缓存。

这是问题所在:

当用户以匿名或非授权用户的身份浏览日程页面视图时,将加载并缓存具有非授权位的日程。然后,如果他们以裁判的身份登录或切换帐户,页面应该加载几个与裁判相关的元素,主要是得分输入,以便他们可以保持比赛分数。但是,似乎加载了页面的非授权缓存版本,因此他们无法按应有的方式与计划进行交互。相反的情况也会发生:如果审阅者查看了该页面并对其进行了缓存,然后注销,他们将看到授权页面作为匿名用户,而他们不应该这样做。

但是,如果我使用我的员工帐户登录,或者如果计划管理员登录,则会加载页面的 admin/staff 版本,这正是我们想要的。

我对这个缓存框架如何工作的理解是,一旦路由被任何人访问,页面就会生成并缓存。从那时起,直到缓存过期,该缓存页面将提供给每个人。是这样吗?

这可以解释为什么审稿人看到了错误的页面,但是……管理员不应该也有同样的问题吗?请帮助我了解这是如何工作的。

这个问题的第二点是解决主要问题:如何在裁判用户打开页面时加载正确版本的页面?

您对缓存机制工作原理的理解是正确的。默认情况下,如果任何人访问 URL,它将被缓存给其他人。

由于您没有显示 dont_vary_on 装饰器的代码,它不是标准的 Django 装饰器,我们无法告诉您为什么它似乎对员工有效(如果您确定他们正在访问相同的 URL).

但基本上您需要根据 HTTP 请求 headers 改变缓存键,这样如果那些 headers 发生变化,页面就是 re-rendered。阅读 Vary headers。 Django 缓存中间件支持这些 headers.