同一URLでPCとモバイルでキャッシュページを切り替えるには、Varyヘッダを利用する方法などが考えられますが、
ここでは django-bpmobile を組み込んでいる場合に利用できる agent 判定を組み込んだ @cache_page デコレータの例を示す。
(agentの判定方法次第でキャリアごとにキャッシュすることも可能です。)
# -*- coding: utf-8 -*- try: from functools import wraps except ImportError: from django.utils.functional import wraps # Python 2.4 fallback. from django.utils.decorators import available_attrs from django.views.decorators.cache import cache_page def cache_page_with_bpmobile(cache_timeout, nonmobile_key_prefix, mobile_key_prefix): """PCとモバイルに分けてキャッシュを保持するキャッシュページデコレータです。""" def __cache_page_with_bpmobile(view_func): # 引数 view_func をラップする関数を定義 @wraps(view_func, assigned=available_attrs(view_func)) def _cache_page_with_bpmobile(request, *view_args, **view_kwargs): # モバイル以外の場合 if request.agent.is_nonmobile(): # モバイル以外のキープリフィックスを設定 cache_key_prefix = nonmobile_key_prefix # モバイルの場合 else: # モバイルのキープリフィックスを設定 cache_key_prefix = mobile_key_prefix # キープリフィックスを指定してcache_pageに処理を委託 return cache_page(view_func, cache_timeout, key_prefix=cache_key_prefix)(request, *view_args, **view_kwargs) return _cache_page_with_bpmobile return __cache_page_with_bpmobile
@cache_page_with_bpmobile デコレータは以下ように利用する。
views.py
@cache_page_with_bpmobile(cache_timeout=60*60, nonmobile_key_prefix='pc_cache', mobile_key_prefix='mobile_cache') def top_page(): ...