2009-10-19 5 views
11

最近私はDjangoの優れたキャッシュフレームワークを実装しました。しかし私はDjangoが取得リクエストでパラメータを渡すビューをキャッシュしないことを理解しています。 私はAjaxビューを渡して、X秒間キャッシュしたいパラメータを取得しましたが、これは簡単な方法でしょうか?擬似コードでURLパラメータを持つdjangoビューをキャッシュする

私は現在、URLを持っている:

http://mysites/ajaxthing/?user=foo&items=10 

私がいる限り、それは同じGETパラメータを持っているとして、任意のこのURLをキャッシュしたいと思います。

私は現在、私の見解でキャッシュデコレータを使用しています:

myview(stuff) 

myview = cache_page(myview, 60 * 3) 

が、私はおよそdjango's vary headersを読みましたが、それは私の頭の上に少し行き、私もその正解はわからない

+2

をあなたはしたくないいくつかの理由があります'http:// mysites/ajaxthing/user/foo/items/10 /'この方法でこの問題をうまく解決することができます。 –

+0

下記のeuqidronの答えをお読みください。この動作はDjango 1.3で変更されています。 –

答えて

16

右、ヘッダを変えるには正しいソリューションではありません、あなたがなど

ユーザーエージェントのようなクライアント要求ヘッダーに基づいてキャッシュしたいときは、low-level APIまたはtemplate fragment cachingを使用する必要があります使用しています。本当にあなたの意見にかかっています。

from django.core.cache import cache 

def get_user(request): 
    user_id = request.GET.get("user_id") 
    user = cache.get("user_id_%s"%user_id) 
    if user is None: 
     user = User.objects.get(pk=user_id) 
     cache.set("user_id_%s"%user_id, user, 10*60) # 10 minutes 
    ... 
    .. 
    . 
+0

テンプレートフラグメントキャッシュ用に+1。状況によっては本当に便利です。 –

+0

簡潔な概要をありがとう、本当に便利です。 –

0

少し遅れていますが、そのためのdjango-view-cache-utilsを使用することができます。低レベルのAPIで

が、それは次のようになります。

8

はい、あなたはジャンゴ・ビュー・キャッシュ-utilsのを使用することができ、ここにあなたのケースのためのコードはありません:

from view_cache_utils import cache_page_with_prefix 
from django.utils.hashcompat import md5_constructor 
... 
@cache_page_with_prefix(60*15, lambda request: md5_constructor(request.get_full_path()).hexdigest()) 
def my_view(request): 
    ... 
+2

このアプローチはうまくいきますが、コードで2つの大きな問題が発生しました.1同じURL引数を持つ2つのビューに対して競合が発生する可能性があります。2.辞書エントリの表示に指定がないため、str(request.GET)注文。私は後でこのコードを代わりに使用しました:@cache_page_with_prefix(60 * 15、ラムダリクエスト:md5_constructor(request.build_absolute_uri()).hexdigest())。 –

+0

最新情報をお寄せいただきありがとうございます。 –

1

URLにパラメータがあるかどうかにかかわらず、キャッシュしようとしているView関数の上に@cache_page([長さ])を置くより複雑な作業は必要ありません。 。

あなたのようなURLがある場合たとえば、:

http://example.com/user/some_user_id 

views.pyであなたのビュー関数は次のようなものになります。

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

@cache_page(60 * 10) 
def get_user_detail(request, user_id=None): 
    ... 
    return render(...) 
+0

私はこれを試しましたが、一般的なビューを使用するときにurls.pyからAttributeErrorを取得しました:url(r '^(?P [0-9] +)/ teams /(?P [0-9] +)/ detail/$ '、views。AttributeError: 'function'オブジェクトには属性 'as_view'がありません(TeamDetailView.as_view()、name = 'team_detail' – simi

関連する問題