我将如何为匿名用户缓存页面但在 Django 1.6 中为授权用户呈现它们?曾经有一个听起来很完美的 CACHE_MIDDLEWARE_ANONYMOUS_ONLY 标志,但它已被删除。
我问是因为每个页面都有一个菜单栏,显示登录用户的姓名和指向他/她的个人资料的链接。
这样做的正确方法是什么?一定是一个常见的问题,但我没有找到通过查看 Django 文档的正确方法。
我将如何为匿名用户缓存页面但在 Django 1.6 中为授权用户呈现它们?曾经有一个听起来很完美的 CACHE_MIDDLEWARE_ANONYMOUS_ONLY 标志,但它已被删除。
我问是因为每个页面都有一个菜单栏,显示登录用户的姓名和指向他/她的个人资料的链接。
这样做的正确方法是什么?一定是一个常见的问题,但我没有找到通过查看 Django 文档的正确方法。
这不需要视图中的任何代码:
{% with cache_timeout=user.is_staff|yesno:"0,300" %}
{% cache cache_timeout cacheidentifier user.is_staff %}
your content here
{% endcache %}
{% endwith %}
context = {"cache_timeout": 300 if request.user.is_anonymous() else 0}
{% load cache %}
{% cache cache_timeout "my-cache-fragment" %}
我只需要写一次
{% endcache %}
您可以通过创建装饰器来使用以下方法:
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(r'^$', cache_for_anonim(3600)(MyView.as_view())),
来源:http ://codeinpython.blogspot.com/2017/01/caching-for-anonymous-non-authenticated.html
我不确定这是否是实现此目标的“正确”方式,但我正在使用 {% 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)