2015-11-04 91 views
0

我有一個內部應用程序,在任何時間20-100登錄用戶。爲了幫助加速某些視圖的傳遞,我添加了Memcached,併爲一些靜態視圖添加了模板級緩存(片段)。Django Memcached顯示錯誤登錄用戶

開啓memcached幾分鐘後,您將看到不同的用戶顯示在標題中的「Logged in as」中。刷新頁面通常會顯示一個不同的用戶,就像高速緩存混合了會話一樣?

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

看着你的模板,你顯然會緩存包含登錄用戶詳細信息的邊欄。毫不奇怪,稍後訪問該網站的訪問者將看到來自更早的不同用戶的緩存片段。

{% 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 %}