2011-09-06 57 views
4

我的訪問者從Varnish獲得緩存版本的頁面。 我希望管理員用戶隨時查看當前版本的網頁。 這樣,所有更改都可以直接看到。如果用戶登錄,Django會阻止緩存視圖

有沒有像這樣的存在? 我知道裝飾者@never_cache。 我正在尋找類似的東西,只是如果用戶沒有登錄。

如果它與Django-CMS一起使用,獎勵點數!

+0

這無疑是一個上光油的問題,不是一個Django嗎? –

回答

1

我發現有這樣的:

CACHE_MIDDLEWARE_ANONYMOUS_ONLY = True 

這應該工作對於大多數網站來說,如果沒有區別的話用戶和工作人員之間。

要明確發送Cache-Control標頭的職員,可以編寫一些中間件(也可能不同,Cookie標題不幸地)。

+0

非常有幫助:) – Paulo

+4

此選項已被棄用,並在當前的Django版本中被刪除。 –

8

我認爲你正在使用緩存修飾器。下面的代碼是一個裝飾器,僅當用戶不是管理員時才返回裝飾有另一個裝飾器(即cache_page)的視圖。因此,管理員總是會獲得非裝飾(非緩存)頁面,其他用戶將獲得裝飾(可能緩存)的頁面。它適用於所有可能的裝飾器(不僅適用於cache_page)。

def conditional_cache(decorator): 
    """ Returns decorated view if user is not admin. Un-decorated otherwise """ 

    def _decorator(view): 

     decorated_view = decorator(view) # This holds the view with cache decorator 

     def _view(request, *args, **kwargs): 

      if request.user.is_staff:  # If user is staff 
       return view(request, *args, **kwargs) # view without @cache 
      else: 
       return decorated_view(request, *args, **kwargs) # view with @cache 

     return _view 

    return _decorator 

要使用它,而不是典型的語法:

@cache_page(123) 
def testview(request): 
    (...) 

使用:

@conditional_cache(decorator=cache_page(123)) # The argument is what you usually do with views, but without the @ 
def testview(request): 
    (...) 
+1

有趣的做法! – vdboor

+0

適合我!謝謝 –

0

CACHE_MIDDLEWARE_ANONYMOUS_ONLYis removed in Django 1.8

相反,vary headers可用於更具體的裝飾vary_on_cookie

這意味着根據每個用戶的cookie保留一個單獨的緩存。

登錄用戶有一個cookie,而不是登錄的用戶,因此每個cookie會話都創建不同的緩存。接下來是我的實施。

urls.py項:

from django.views.decorators.vary import vary_on_cookie 
from django.views.decorators.cache import cache_page 

... 
    url(
      r'^$', 
      cache_page(60 * 1440, cache='disk')(vary_on_cookie(MyCbvView.as_view())), 
      name='view-name', 
     ), 
...