【发布时间】:2015-11-04 07:09:30
【问题描述】:
我正在尝试在某些特定报告页面上实现基于文件的按视图缓存。我将特别关注一个名为 ScorecardSummary 的示例。
在 urls.py 中:
url(r'^(?P<institution_slug>[^/]+)/report/(?P<submissionset>[^/]+)/$',
ScorecardSummary.as_view(), name='scorecard-summary'),
在views.py中:
class ScorecardSummary(ScorecardView):
template_name = 'institutions/scorecards/summary.html'
为了实现缓存,我像这样改变了视图:
class ScorecardSummary(ScorecardView):
template_name = 'institutions/scorecards/summary.html'
@method_decorator(vary_on_cookie)
@method_decorator(cache_page(86400 * 30, cache="filecache"))
def dispatch(self, request, *args, **kwargs):
if request.user.is_anonymous():
response = super(ScorecardSummary, self).dispatch(request, *args, **kwargs)
patch_cache_control(response, public=True)
else:
response = super(ScorecardSummary, self).dispatch(request, *args, **kwargs)
patch_cache_control(response, private=True)
return response
我在方法之前和使用patch_cache_control() 或patch_vary_headers() 的逻辑中尝试了这些装饰器的几种不同排列。
如果没有 vary_on_cookie,每个用户都会在页面的右上角看到原始用户的信息(即“电子邮件地址 | 注销链接”)。匿名用户也是如此,这就是问题的根源。
我找到了上述解决方案。正如所写,它的工作原理是它为每个用户或匿名创建一个新的页面缓存版本。这对每个人来说都很棒
我的问题是每次匿名访问页面时,无论现有缓存文件如何,它都会创建一个新缓存而不是加载现有缓存,这有点违背了目的。如果我将其修复为匿名缓存,那么我们将返回为每个用户提供完全相同的版本,而我又回到了我开始的地方。
我也尝试过使用 vary_on_headers('User-Agent'),但它仍然区分每个匿名用户,而不是将它们视为相同。将 private 或 public 设置为 True 与否似乎没有任何效果。
所以我的问题是这样的:
这些装饰器是否有一些排列来控制缓存,以便缓存经过身份验证的和匿名的,如果匿名用户已经触发了缓存的创建,则该版本将提供给所有匿名用户,而不是总是丢失。
或者,是否有更好的方法来实现这种按视图缓存来绕过这个问题并达到相同的目的? (即不管身份验证如何缓存,但不共享用户特定数据)。
谢谢!
【问题讨论】:
-
在深入研究用户代理想法的任何细节之后,看起来这是一个标题字符串,它引用经过身份验证的用户对象或为该匿名创建的 AnonymousUser 对象实例。所以我的问题是它在整个唯一实例上有所不同。但是,所有这些实例都将具有相同的“id”属性设置为“None”。答案可能是“不是没有自定义装饰器”,但是有没有办法根据这个对象的属性而不是整个实例来改变缓存?
标签: django python-2.7 caching python-decorators