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

问题描述

我遇到了一个问题,即某个用户角色的页面没有正确显示,我确信问题出在缓存上。该页面是加载了 AJAX 的运动日程的部分视图:

url(pattern, cache_page(CACHE_TIMEOUT)(last_modified(season_modified(dont_vary_on("Cookie")(ScheduleView.as_view()))), name='schedule_partial')

请注意,这season_modified是一个返回上次修改季节/时间表的函数。它用于刷新缓存。

这是问题所在:

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

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

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

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

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

标签: pythondjangocachingdjango-1.8

解决方案


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

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

但基本上您需要根据 HTTP 请求标头更改缓存键,以便如果这些标头更改,则重新呈现页面。阅读有关Vary headers的信息。Django 缓存中间件尊重这些标头。


推荐阅读