ファイルシステムに保存するようにビーカーを設定すると、各引数もピクルされていることが簡単にわかります。例:
tp3
sS'tags <myapp.controllers.tags.TagsController object at 0x103363c10> <MySQLdb.cursors.Cursor object at 0x103363dd0> apple'
p4
キャッシュの「キー」には、キーワード「apple」だけでなく、インスタンス固有の情報が含まれていることに注意してください。特に「自己」は呼び出し間で同じではないため、これはかなり悪いことです。キャッシュは毎回ミスになります (そして、役に立たないキーでいっぱいになります)。
キャッシュ アノテーションを含むメソッドには、考えている「キー」に対応する引数のみを指定する必要があります。これを言い換えると、"John" が値 555-1212 に対応するという事実を保存し、これをキャッシュしたいとします。関数は、引数として文字列以外のものを取らないでください。渡す引数は、呼び出しから呼び出しまで一定である必要があるため、「self」のようなものは不適切です。
これを機能させる簡単な方法の 1 つは、キー以外に何も渡す必要がないように、関数をインライン化することです。例えば:
def index(self):
# some code here
# suppose 'place' is a string that you're using as a key. maybe
# you're caching a description for cities and 'place' would be "New York"
# in one instance
@cache_region('long_term', 'place_desc')
def getDescriptionForPlace(place):
# perform expensive operation here
description = ...
return description
# this will either fetch the data or just load it from the cache
description = getDescriptionForPlace(place)
キャッシュ ファイルは次のようになります。「place_desc」と「John」のみがキーとして保存されていることに注意してください。
tp3
sS'place_desc John'
p4