Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Django 1.4每站点缓存不能与缓存\中间件\匿名\一起正常工作?_Django - Fatal编程技术网

为什么Django 1.4每站点缓存不能与缓存\中间件\匿名\一起正常工作?

为什么Django 1.4每站点缓存不能与缓存\中间件\匿名\一起正常工作?,django,Django,我正在从事Django 1.4项目,并使用每个站点缓存编写一个简单的应用程序,如下所述: 我已正确设置本地Memcached服务器,并确认页面正在缓存 然后我将CACHE\u MIDDLEWARE\u ANONYMOUS\u ONLY设置为True,因为我不想为经过身份验证的用户缓存页面 我正在使用一个简单的视图进行测试,该视图返回一个带有render_to_响应和RequestContext的模板,以便能够从模板访问用户信息,并且缓存到目前为止运行良好,这意味着它只为匿名用户缓存页面 这是我的

我正在从事Django 1.4项目,并使用每个站点缓存编写一个简单的应用程序,如下所述:

我已正确设置本地Memcached服务器,并确认页面正在缓存

然后我将CACHE\u MIDDLEWARE\u ANONYMOUS\u ONLY设置为True,因为我不想为经过身份验证的用户缓存页面

我正在使用一个简单的视图进行测试,该视图返回一个带有render_to_响应和RequestContext的模板,以便能够从模板访问用户信息,并且缓存到目前为止运行良好,这意味着它只为匿名用户缓存页面

这是我的问题。我使用另一个模板创建了另一个视图,该模板不访问用户信息,并注意到即使用户经过身份验证,页面仍在缓存中。在测试了很多东西之后,我发现如果模板没有从用户上下文变量打印内容,经过身份验证的用户将获得一个缓存页面。测试非常简单:在模板上打印用户,页面将不会为经过身份验证的用户缓存,删除模板上的用户,在经过身份验证时刷新页面,并检查HTTP头,您将注意到您将获得一个缓存页面。您应该清除更改之间的缓存,以便更清楚地看到问题

我进行了更多的测试,发现我可以在模板中删除用户,并在视图上打印request.user,该视图将打印到开发服务器控制台,这也解决了向经过身份验证的用户显示缓存页面的问题,但这是一个丑陋的黑客行为

此处报告了类似的问题,但从未得到答案:

我可能可以编写一个条件装饰器来检查user.u是否经过身份验证,并基于我视图中的use@never\u缓存,但这似乎违背了使用每个站点缓存的目的,不是吗

"""
A decorator to bypass per-site cache if the user is authenticated. Based on django.views.decorators.cache.never_cache.
See: http://stackoverflow.com/questions/12060036/why-django-1-4-per-site-cache-does-not-work-correctly-with-cache-middleware-anon
"""     

from django.utils.decorators import available_attrs
from django.utils.cache import add_never_cache_headers
from functools import wraps

def conditional_cache(view_func):
    """
    Checks the user and if it's authenticated pass it through never_cache.
    This version uses functools.wraps for the wrapper function.
    """ 
    @wraps(view_func, assigned=available_attrs(view_func))
    def _wrapped_view_func(request, *args, **kwargs):
        response = view_func(request, *args, **kwargs)
        if request.user.is_authenticated():
            add_never_cache_headers(response)
        return response
    return _wrapped_view_func
任何建议,以避免额外的装饰需要将不胜感激


谢谢

好的,我刚刚确认我的问题是由Django延迟加载用户对象引起的

为了证实这一点,我在我的视图中添加了如下内容:

test_var=some text+request.user

我收到一条错误消息,告诉我无法将str连接到SimpleLazyObject。此时,延迟加载逻辑还没有得到真正的用户对象

为了绕过延迟加载,从而为经过身份验证的用户返回非缓存视图,我只需要访问一些方法或属性来触发对用户对象的实际查询。我以这个结束,我认为这是最简单的方式:

绕过\u lazyload=request.user.is\u验证

我的条件_缓存装饰器不再需要,尽管这是一个有趣的练习

当我完成视图的工作时,我可能不需要这样做,因为我将访问模板上的一些用户方法和属性,但最好知道发生了什么


问候。

好的,我刚刚确认我的问题是由Django延迟加载用户对象引起的

为了证实这一点,我在我的视图中添加了如下内容:

test_var=some text+request.user

我收到一条错误消息,告诉我无法将str连接到SimpleLazyObject。此时,延迟加载逻辑还没有得到真正的用户对象

为了绕过延迟加载,从而为经过身份验证的用户返回非缓存视图,我只需要访问一些方法或属性来触发对用户对象的实际查询。我以这个结束,我认为这是最简单的方式:

绕过\u lazyload=request.user.is\u验证

我的条件_缓存装饰器不再需要,尽管这是一个有趣的练习

当我完成视图的工作时,我可能不需要这样做,因为我将访问模板上的一些用户方法和属性,但最好知道发生了什么

问候