python - 了解 Django 的缓存框架如何工作并处理不同用户角色的缓存页面
问题描述
我遇到了一个问题,即某个用户角色的页面没有正确显示,我确信问题出在缓存上。该页面是加载了 AJAX 的运动日程的部分视图:
url(pattern, cache_page(CACHE_TIMEOUT)(last_modified(season_modified(dont_vary_on("Cookie")(ScheduleView.as_view()))), name='schedule_partial')
请注意,这season_modified
是一个返回上次修改季节/时间表的函数。它用于刷新缓存。
这是问题所在:
当用户以匿名或非授权用户的身份浏览日程页面视图时,带有非授权位的日程将被加载和缓存。然后,如果他们以裁判员身份登录或切换帐户,则页面应加载几个与裁判员相关的元素,主要是得分输入,以便他们保持比赛得分。但是,似乎加载了页面的非授权缓存版本,因此它们无法与计划进行应有的交互。相反的情况也会发生:如果裁判查看页面并缓存,然后注销,他们会将授权页面视为匿名用户,而他们不应该这样做。
但是,如果我使用我的员工帐户登录,或者如果计划管理员登录,则会加载页面的管理员/员工版本,这就是我们想要的。
我对这个缓存框架如何工作的理解是,一旦路由被任何人访问,页面就会被生成并缓存。从那时起,直到缓存过期,该缓存页面将提供给每个人。它是这样工作的吗?
这可以解释为什么裁判看到错误的页面,但是......管理员不应该也有同样的问题吗?请帮助我了解这是如何工作的。
这个问题的第二点是解决主要问题:当裁判用户打开页面时,如何加载正确版本的页面?
解决方案
您对缓存机制如何工作的理解是正确的。默认情况下,如果有人访问一个 URL,它将被缓存给其他人。
由于您没有显示dont_vary_on
装饰器的代码,它不是标准的 Django 装饰器,因此我们无法告诉您为什么它似乎对员工有效(如果您确定他们正在访问相同的 URL)。
但基本上您需要根据 HTTP 请求标头更改缓存键,以便如果这些标头更改,则重新呈现页面。阅读有关Vary headers的信息。Django 缓存中间件尊重这些标头。
推荐阅读
- c++ - 如何检测函数是否存在?
- java - gradle 从所有 jar 中排除外部资源文件夹
- database - 在 Matlab 中处理数千个文本文件的最快/有效方法是什么?
- c# - 'System.Void' 类型不能用作类型参数!发生错误
- laravel - 从 cron 作业的工匠命令运行时,Curl 返回空响应
- time - HIVE:如何计算时间格式的秒差:yyyyMMdd HH:mm:ss
- docker - Docker DNS 设置
- javascript - 实现将用作 WebView 的动态网页的最佳方法是什么?
- javascript - 如何切换文本
使用 JS 和 onkeydown 事件
- jenkins - Jenkins Build 在 jenkins UI 中消失但存在于主机中?