Django Memcached显示错误的登录用户

时间:2015-11-04 16:12:23

标签: django memcached

我有一个内部应用程序,在任何时候都有20-100个登录用户。为了帮助加快某些视图的传递,我添加了Memcached并为一些静态视图添加了模板级缓存(片段)。

打开memcached几分钟后,您会在标题的“登录身份”显示中看到另一个用户。刷新页面通常会显示不同的用户,就好像缓存正在混淆会话一样?

enter image description here

我的Middleware.py

MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.gzip.GZipMiddleware',

CACHES = {
'default': {
    'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
    'LOCATION': '127.0.0.1:11211',
}

}

以下是我在一些模板上使用的缓存标记的示例:

{% load cache %}
{% cache 500 right_sidebar %}
<aside class="user-menu no-print">
  <div class="tabs-offcanvas">
    <ul class="nav nav-tabs nav-justified">
      <li class="active"><a href="#userbar-one" data-toggle="tab">Main</a>
      </li>
      <li><a href="#userbar-two" data-toggle="tab">ToDo</a>
      </li>
    </ul>
    <div class="tab-content">
      <div id="userbar-one" class="tab-pane active">
        <div class="main-info">
          <div class="user-img">{% include "_tag_avatar.html" %}
          </div>
          <h1>{{ request.user.first_name }}&nbsp;{{ request.user.last_name }}</h1>
        </div>
        <div class="list-group"><a href="/accounts/profile/?id={{request.user.id}}" class="list-group-item"><i class="fa fa-user">&nbsp;Profile</i></a><a href="/accounts/lock/" data-toggle="modal" class="list-group-item lockme"><i class="fa fa-lock">&nbsp;Lock</i></a><a href="/accounts/logout/" data-toggle="modal" class="list-group-item logout"><i class="fa fa-power-off">&nbsp;Sign Out</i></a>
        </div>
      </div>
....

我没有在视图上实现任何缓存,只是对那些静态的使用模板进行模板级缓存。我也没有缓存标题HTML。

关于我可能做错的任何想法?

1 个答案:

答案 0 :(得分:1)

查看模板,您显然正在缓存包含登录用户详细信息的侧边栏。毫不奇怪,该网站的后来访问者将看到来自较早的不同用户的缓存片段。

{% load cache %}
{% cache 500 right_sidebar %}
...
<h1>{{ request.user.first_name }}&nbsp;{{ request.user.last_name }}</h1>
...
{% endcache %}

最简单的解决方法是从此块中删除缓存标记。或者,文档建议您在使用缓存标记和每个用户缓存时可以包含用户名。执行此操作时,您将拥有更少的“缓存命中率”,因此只对包含用户详细信息的块执行此操作。

{% load cache %}
{% cache 500 right_sidebar request.user.username %}
...
<h1>{{ request.user.first_name }}&nbsp;{{ request.user.last_name }}</h1>
...
{% endcache %}