質問
Djangoで、認証されたユーザーにのみ表示される単一のキャッシュバージョンのページ(すべてのユーザーに同じ)を作成するにはどうすればよいですか?
設定
キャッシュしたいページは、認証されたユーザーのみが利用できます(ビューで使用@login_required
します)。これらのページは、認証されたすべてのユーザーで同じです(たとえばvary_on_headers
、一意のユーザーに基づいて設定する必要はありません)。
ただし、これらのキャッシュされたページが認証されていないユーザーに表示されないようにする必要があります。
私がこれまでに試したこと
- ページレベルのキャッシュ(ログインしているユーザーからログインしていないユーザーを対象としたページを表示します)
- の使用を検討しまし
vary_on_headers
たが、ユーザーごとに個別にキャッシュされたページは必要ありません - テンプレートフラグメントのキャッシュをチェックアウトしましたが、混乱しない限り、これは私のニーズを満たしません
- 実質的な検索(誰もが逆のことをしたいと思っているようです)
ありがとう!
例ビュー
@login_required
@cache_page(60 * 60)
def index(request):
'''Display the home page'''
return render(request, 'index.html')
settings.py(関連部分)
# Add the below for memcache
MIDDLEWARE_CLASSES += (
'django.middleware.cache.UpdateCacheMiddleware',
'django.middleware.cache.FetchFromCacheMiddleware',
)
# Enable memcache
# https://devcenter.heroku.com/articles/memcache#using_memcache_from_python
CACHES = {
'default': {
'BACKEND': 'django_pylibmc.memcached.PyLibMCCache'
}
}
解決
@Tishoの回答に基づいて、私はこの問題を次のように解決しました
decorators.py
アプリでファイルを作成する- 以下のコードを追加します
- で関数をインポートする
views.py
- ログインしたユーザーのみにキャッシュしたいビューにデコレータとして適用する
decorators.py
from functools import wraps
from django.views.decorators.cache import cache_page
from django.utils.decorators import available_attrs
def cache_on_auth(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 cache_page(timeout)(view_func)(request, *args, **kwargs)
else:
return view_func(request, *args, **kwargs)
return _wrapped_view
return decorator
ログインしているユーザーの場合、ログインしていないユーザーのページをキャッシュします(またはキャッシュされたページを提供します)。通常のビューが表示され、装飾されて@login_required
おり、ログインが必要になります。