2

Django アプリケーションと postgres バックエンドがあります。基本的には、大規模なデータベースを備えた検索サイトであり、データは通常 1 日に 1 回変更されます。データベースの負荷を軽減するために、キャッシングを開始したいと考えています。

memcached をセットアップしましたが、ビューには次のアーキテクチャがあり、アプリがフロントエンドで Ajax を使用できるように設計されています。

@cache_page(60 * 60 * 12)
def items(request, pattern=None, specialurl=None):
  if request.is_ajax():
    template = "result_ajax.html"
  else: 
    template = "index.html"

残念ながら、キャッシングと Ajax 呼び出しの特別な処理の組み合わせはうまく機能しません。

これは、memcached が Ajax の結果と非 Ajax の結果を区別しないためです。したがって、フロントエンドからの Ajax 呼び出しにはキャッシュされた非 Ajax の結果が与えられ、その逆も同様です。

だから私がする必要があるのは、他にどのようにキャッシュするかを理解することです。次のオプションを考えることができます。

  1. 一度に最大 1 日間、データベース クエリのみをキャッシュします。これは可能ですか?
  2. result_ajax.html実際に結果を表示するテンプレートのフラグメントをキャッシュします。(index.html実際に含まれresult_ajax.htmlます。)

これらのうち、物事を行うための最良の方法はどれですか?

4

1 に答える 1

7

Ajax リクエストと非 Ajax リクエストに別のキャッシュ キーを使用するようにキャッシュ デコレーターに指示する次のような方法を試してみます。

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

@cache_page(60 * 60 * 12)
@vary_on_headers('X-Requested-With')
def items(request, pattern=None, specialurl=None):
  if request.is_ajax():
    template = "result_ajax.html"
  else: 
    template = "index.html"
于 2013-06-17T22:02:01.583 に答える