【发布时间】:2020-11-04 20:35:41
【问题描述】:
我们有一个用 python 2.7 和 django 1.11 编写的遗留应用程序(并且没有要迁移的资源)。它还使用grappelli 进行授权。我们尝试为某些页面添加Edit 链接(每个页面都显示Round 对象的详细信息),这些链接应该只对授权用户可见有权编辑回合(@987654327 @ 在grappelli Web 界面中)。在模板中,权限检查如下:
{% if perms.round.can_change_round %}
 <a href="{{link_to_change_round}}" class="stuff-only-link">{% trans 'Edit' %}</a>
{% endif %}
当以下事件在很短的时间间隔内发生时,就会出现问题:
- 有权编辑回合的用户访问页面 - 并看到
Edit链接。 - 无权编辑回合的用户(例如匿名用户)访问相同的页面 - 并且还看到了链接!
相关设置 (settings.py) 是:
CACHES = {
'default': {
# 'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
}
}
SOLO_CACHE = 'default'
SOLO_CACHE_TIMEOUT = 5*60
当我将缓存更改为dummy 时,问题就消失了。因此,完全禁用授权用户的缓存似乎是一个明显的解决方案。更准确地说:
a) 如果用户是匿名用户(大多数真实站点用户) - 请求的页面可以写入缓存,也可以从缓存中读取;
b) 如果用户被授权(大约 5-7 个用户) - 请求的页面不能写入缓存,也不能从缓存中读取。
我如何做到这一点?
【问题讨论】:
-
那么你是如何缓存的? CacheMiddleware? Decorators? Fragments?
-
看起来我们正在使用装饰器:
-
@cache_page(cache_duration)
标签: python django caching authorization django-grappelli