Python Django 1.11:禁用身份验证用户的缓存

Python Django 1.11:禁用身份验证用户的缓存,python,django,caching,authorization,django-grappelli,Python,Django,Caching,Authorization,Django Grappelli,我们有一个用Python2.7和django 1.11编写的遗留应用程序,没有可迁移的资源。它还使用Grapelli进行授权。我们尝试为某些页面添加编辑链接。每个页面都显示有关Round对象的详细信息,只有拥有编辑Round APPNAME | Round |可以在grappelli web界面中更改Round的权限的授权用户才能看到这些信息。在模板中,权限的检查方式如下: {%if perms.round.can_change_round%}   {%endif%} 当以下事件在短时

我们有一个用Python2.7和django 1.11编写的遗留应用程序,没有可迁移的资源。它还使用Grapelli进行授权。我们尝试为某些页面添加编辑链接。每个页面都显示有关Round对象的详细信息,只有拥有编辑Round APPNAME | Round |可以在grappelli web界面中更改Round的权限的授权用户才能看到这些信息。在模板中,权限的检查方式如下:

{%if perms.round.can_change_round%}   {%endif%} 当以下事件在短时间间隔内发生时,会出现问题:

有权编辑一轮的用户访问一个页面,并看到编辑链接。 没有权限编辑轮次的用户,例如匿名用户访问同一页面,并看到链接! relvant settings.py包括:

缓存={ “默认值”:{ 'BACKEND':'django.core.cache.backends.dummy.DummyCache', 'BACKEND':'django.core.cache.backends.locmem.LocMemCache', } } SOLO_缓存='默认' 单缓存超时=5*60 当我将缓存更改为dummy时,问题就消失了。因此,完全禁用授权用户的缓存似乎是一个显而易见的解决方案。更准确地说:

a如果一个用户是大多数真实站点用户的匿名用户,那么请求的页面可以写入缓存,也可以从缓存中读取

b如果一个用户被授权约5-7个用户-请求的页面无法写入缓存,也无法从缓存读取


如何实现这一点?

您可以对模板的缓存部分进行分段,并从缓存中删除与用户相关的部分,或者根据分段变量状态对其进行缓存。

您可以对模板的缓存部分进行分段,并从缓存中删除与用户相关的部分,或者根据分段变量状态对其进行缓存非常感谢@Melvin提供了文档链接。在谷歌搜索了一个小时后,找到了答案并进行了修改。代码是:

编辑:最初,缓存是基于函数的。 因此,/rounds/1给出了与/rounds/2相同的缓存值。 我们将完整的URL添加到缓存密钥以解决此问题

-*-编码:utf-8-*- ' Python>=2.4 Django>=1.0 作者:eu@rafaelsdm.com ' https://djangosnippets.org/snippets/2524/ https://stackoverflow.com/questions/20146741/django-per-user-view-caching https://stackoverflow.com/questions/62913281/django-1-11-disable-cache-for-authentificated-users 从django.core.cache导入缓存 def cache_per_userttl=None,前缀=None: “Decorador que faz cache da view pra cada usuario” *ttl-视频缓存的速度,não enviar esse parametro signiti que o 缓存vai durar atéque o servidor reinicie ou decida ou decida lo移除 *prefix-Prefixo a ser usado para armazenar o响应无缓存。卡索瑙 seja informado sera usado“查看缓存”+函数名__ *cache_post-要求邮政信息 *O缓存通常的比较对象 *一个可能的操作系统: “%s\u%s”%user.id前缀 “%s\u匿名”前缀 “查看\u缓存\uu%s\u%s”%function.\uuuuu名称\uuuuu,user.id '查看\u缓存\uu%s\u匿名'%s'函数。\uu\u名称__ ' def decoratorfunction: def apply_cacherequest,*args,**kwargs: 授权用户无缓存: 他们必须立即查看编辑的结果! can_cache=request.user.is_匿名,request.method=='GET' 杰拉·查维多·卡什 如果前缀为: 缓存\u键=“%s\u%s”%prefix,“匿名” 其他: CACHE\u KEY='view\u CACHE\u%s\u%s'%1!'函数。\ u名称\u,请求。获取\u完整路径,'anonymous' 如果可以缓存: response=cache.getCACHE\u键,无 其他: 响应=无 如果没有答复: 打印“不在缓存中:%s”%cache\u密钥 响应=函数请求,*args,**kwargs 如果可以缓存: cache.setCACHE_键,响应,ttl 返回响应 返回应用缓存 返回装饰器 然后在views.py中:

从缓存每用户导入缓存每用户作为缓存页面 ... @缓存页面缓存持续时间 def循环详细信息请求,主键:
非常感谢@Melvin提供的文档链接。在谷歌搜索了一个小时后,找到了答案并进行了修改。代码是:

编辑:最初,缓存是基于函数的。 因此,/rounds/1给出了与/rounds/2相同的缓存值。 我们将完整的URL添加到缓存密钥以解决此问题

-*-编码:utf-8-*- ' Python>=2.4 Django>=1.0 作者:eu@rafaelsdm.com ' https://djangosnippets.org/snippets/2524/ https://stackoverflow.com/questions/20146741/django-per-user-view-caching https://stackoverflow.com/questions/62913281/django-1-11-disable-cache-for-authentificated-users 来自django.c ore.cache导入缓存 def cache_per_userttl=None,前缀=None: “Decorador que faz cache da view pra cada usuario” *ttl-视频缓存的速度,não enviar esse parametro signiti que o 缓存vai durar atéque o servidor reinicie ou decida ou decida lo移除 *prefix-Prefixo a ser usado para armazenar o响应无缓存。卡索瑙 seja informado sera usado“查看缓存”+函数名__ *cache_post-要求邮政信息 *O缓存通常的比较对象 *一个可能的操作系统: “%s\u%s”%user.id前缀 “%s\u匿名”前缀 “查看\u缓存\uu%s\u%s”%function.\uuuuu名称\uuuuu,user.id '查看\u缓存\uu%s\u匿名'%s'函数。\uu\u名称__ ' def decoratorfunction: def apply_cacherequest,*args,**kwargs: 授权用户无缓存: 他们必须立即查看编辑的结果! can_cache=request.user.is_匿名,request.method=='GET' 杰拉·查维多·卡什 如果前缀为: 缓存\u键=“%s\u%s”%prefix,“匿名” 其他: CACHE\u KEY='view\u CACHE\u%s\u%s'%1!'函数。\ u名称\u,请求。获取\u完整路径,'anonymous' 如果可以缓存: response=cache.getCACHE\u键,无 其他: 响应=无 如果没有答复: 打印“不在缓存中:%s”%cache\u密钥 响应=函数请求,*args,**kwargs 如果可以缓存: cache.setCACHE_键,响应,ttl 返回响应 返回应用缓存 返回装饰器 然后在views.py中:

从缓存每用户导入缓存每用户作为缓存页面 ... @缓存页面缓存持续时间 def循环详细信息请求,主键:
那么你是如何缓存的呢?看起来我们正在使用一个装饰器:@cache\u pagecache\u duration那么你是如何缓存的呢?看起来我们正在使用一个装饰器:@cache\u pagecache\u duration