4

アプリのプロファイリングを開始したところ、完了するまでに他のコードよりも大幅に時間がかかるコードがあることがわかりました。ビューでは、データベースからデータを取得し、少し変換しています。テンプレートには、この変換されたデータを取得して HTML に変換するフィルターがあります。

このコンポーネントはそれほど頻繁に変更されないため、キャッシングを活用できることに気付きましたが、それを行う最善の方法は何だろうと思っています。データベース呼び出し/変換の両方の結果をキャッシュできますが、テンプレート フラグメントもキャッシュできます。最高の効果を得るために 2 つのものをキャッシュする必要があるのは奇妙に思えるので、データを 1 つの場所にキャッシュするだけでよいように、コードを別の構造にする必要があると思います。

私が持っていた 1 つのアイデアは、テンプレート フィルター関数内からデータベース呼び出しを行うことですが、モデル コードをテンプレート フィルターの外に保持しようとしています。

この種の問題を処理する最善の方法は何ですか?

4

2 に答える 2

1

変換を複雑なクエリセットとして表すことができる場合は、ビューでキャッシュを使用せずにテンプレートで評価できます。そうでない場合は、できます

  • キャッシュブロック内のテンプレートタグでロジックを実行します
  • ロジックをラップし、通常はクロージャまたはモデル メソッドの形式でレンダリングに渡します。
  • レンダリング プロセスが単純である限り、ビュー キャッシュのみを実行します。
  • TemplateResponse を使用して SSI の可能性を確認する
  • 可能性のある競合書き込みとドッグパイルの問題を考慮して、ビューでテンプレート キャッシュをチェックして使用するコードを記述します。

さらに、クエリセット キャッシュについては、 johnny-cachedjango-cache-machineを試すことができます。

于 2012-04-04T17:59:49.947 に答える
0

ビューとテンプレート フラグメントにキャッシュする必要はありません。キャッシュの考え方は、何かをキャッシュしたら、キャッシュ キーの有効期限が切れるまでキャッシュから取得することです。

データベースの結果をビューにキャッシュすることは、ビュー ロジックに固有のコードを記述することを意味します。これは、ロジックが変更されるたびに変更する必要があるでしょう。

テンプレートの「ロジック」を変更しても、キャッシュされたブロック内にフラグメントを保持している限り、キャッシュは引き続き機能するため、テンプレート フラグメントをキャッシュする方が良い方法です。

また、キャッシュする最終応答に近いほど、キャッシュ ロジックの信頼性が高くなります。

于 2012-04-04T16:17:13.790 に答える