我的訪問者從Varnish獲得緩存版本的頁面。 我希望管理員用戶隨時查看當前版本的網頁。 這樣,所有更改都可以直接看到。如果用戶登錄,Django會阻止緩存視圖
有沒有像這樣的存在? 我知道裝飾者@never_cache
。 我正在尋找類似的東西,只是如果用戶沒有登錄。
如果它與Django-CMS一起使用,獎勵點數!
我的訪問者從Varnish獲得緩存版本的頁面。 我希望管理員用戶隨時查看當前版本的網頁。 這樣,所有更改都可以直接看到。如果用戶登錄,Django會阻止緩存視圖
有沒有像這樣的存在? 我知道裝飾者@never_cache
。 我正在尋找類似的東西,只是如果用戶沒有登錄。
如果它與Django-CMS一起使用,獎勵點數!
我發現有這樣的:
CACHE_MIDDLEWARE_ANONYMOUS_ONLY = True
這應該工作對於大多數網站來說,如果沒有區別的話用戶和工作人員之間。
要明確發送Cache-Control
標頭的職員,可以編寫一些中間件(也可能不同,Cookie
標題不幸地)。
非常有幫助:) – Paulo
此選項已被棄用,並在當前的Django版本中被刪除。 –
我認爲你正在使用緩存修飾器。下面的代碼是一個裝飾器,僅當用戶不是管理員時才返回裝飾有另一個裝飾器(即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):
(...)
有趣的做法! – vdboor
適合我!謝謝 –
CACHE_MIDDLEWARE_ANONYMOUS_ONLY
is 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',
),
...
這無疑是一個上光油的問題,不是一個Django嗎? –