3

plone.memoizeパッケージは、さまざまな関数の値をキャッシュするための便利なヘルパー関数を提供します。

現在のHTTPリクエスト(self.request)の存続期間中、ビュー/ビューレットメソッドの値をキャッシュするためのベストプラクティスは何ですか。これは、plone.memoizeのドキュメントからは完全には明らかではありません。

例:

   class MyView(grok.View):

         # cache this by self.request
         def getExpensiveFunction(self):
               ....
4

1 に答える 1

4

BrowserPageビューインスタンスの存続期間は通常、すでにリクエストの期間であるため、通常はplone.memoize.instanceメモ化デコレータを使用することもできます。

from plone.memoize.instance import memoize

class MyView(grok.View):

    @memoize
    def getExpensiveFunction(self):
        # ....

結局のところ、BrowserPageは通常、特定のURLを検索し、検索時にインスタンス化され、ビューが生成されると破棄されます。新しいリクエストは新しいインスタンスを生成します。

ビューメモ化機能は、現在のリクエストにキャッシュを保存し、現在のコンテキストパス(またはパスがない場合はコンテキストのID)をキャッシュキーとして追加します。リクエスト中にビューがさまざまな場所で検索された場合は、インスタンスのメモ化の代わりにそれを使用できます。

from plone.memoize.view import memoize

class MyView(grok.View):

    @memoize
    def getExpensiveFunction(self):
        # ....

ユーティリティビュー@@plone_contextなどは、から最も恩恵を受けplone.memoize.view.memoizeます。

高価なメソッドがビューコンテキストに依存しmemoize_contextlessない場合は、デコレータを使用してください。これにより、キャッシュキーからビューコンテキストパスが省略されます。

from plone.memoize.view import memoize_contextless

class MyView(grok.View):

    @memoize_contextless
    def getExpensiveFunction(self):
        # ....

したがって、.getExpensiveFunction()このビューのコンテキスト(サイトルートまたはコンテンツツリーの深い場所)に関係なく同じ情報を返す場合は、_contextlessバリアントを使用して、結果のコピーを1つだけ保存します。

于 2012-08-24T15:40:58.823 に答える