Django中匿名用户的缓存

8
我该如何在Django 1.6中为匿名用户缓存页面,却仅为经过授权的用户呈现页面?以前有一个CACHE_MIDDLEWARE_ANONYMOUS_ONLY标志听起来很完美,但是现在已经被删除了。
我问这个问题是因为每个页面都有一个菜单栏,显示已登录用户的名称和链接到他/她的个人资料。
正确的做法是什么?这一定是个常见的问题,但是我从Django文档中没有找到正确的方法。
4个回答

4

这不需要在视图中编写任何代码:

{% with cache_timeout=user.is_staff|yesno:"0,300" %}
    {% cache cache_timeout cacheidentifier user.is_staff %}
        your content here
    {% endcache %}
{% endwith %}

1
context = {"cache_timeout": 300 if request.user.is_anonymous() else 0}

{% load cache %}<br />
{% cache cache_timeout "my-cache-fragment" %}<br />
    <b>I have to write this only once</b><br />
{% endcache %}<br />

0
您可以通过创建一个装饰器来使用以下方法:
def cache_for_anonim(timeout):
    def decorator(view_func):
        @wraps(view_func, assigned=available_attrs(view_func))
        def _wrapped_view(request, *args, **kwargs):

            if request.user.is_authenticated():
                return (view_func)(request, *args, **kwargs)
            else:
                return cache_page(timeout)(view_func)(request, *args, **kwargs)
        return _wrapped_view
    return decorator

然后在你的URL中:

url(r'^$', cache_for_anonim(3600)(MyView.as_view())),

来源:http://codeinpython.blogspot.com/2017/01/caching-for-anonymous-non-authenticated.html


为什么要踩?这看起来是最好的解决方案。 - EralpB

-1

我不确定这是否是实现此目的的“正确”方法,但我正在使用{% cache %}模板标签来解决此问题。模板的动态用户名部分位于我的基本模板中,我将其余部分缓存如下:

{% extends "base.html" %}
{% load cache %}

{% block content %}
{% cache 86400 key-name %}
<h1>My Template in here</h1>
{% endcache %}
{% endblock content %}

通过指定“键名”,您可以在视图中使用以下内容手动清除缓存,以便在需要时进行手动刷新:

key = django.core.cache.utils.make_template_fragment_key('key-name')
cache.delete(key)

嗯,这根本没有为匿名用户添加缓存。:( - mlissner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接