2

DjangoキャッシングにはRailsのcache.fetchと同様のメソッドがありますか?(http://api.rubyonrails.org/classes/ActiveSupport/Cache/Store.html#M001023)Railsキャッシュフェッチは次のように機能します。

cache.fetch( "my_key"){
  //空の場合はmy_keyに入れたいものを返します
  "some_value"
}

キャッシュをチェックし、キャッシュがある場合はその値を返すので便利です。そうでない場合は、「some_value」をキャッシュに保存してから、「some_value」を返します。

Djangoにこれに相当するものはありますか?そうでない場合、このような関数を実装した場合、このPython構文はどのようになりますか?

4

3 に答える 3

4

あなたが書かなければならないコードは次のようになると思います:(編集)

def get_value(param1,param2):
    return "value %s - %s " % (str(param1),str(param2))

def fetch(key,val_function,**kwargs)
    val = cache.get(key)
    if not val:
        val = val_function(**kwargs)
        cache.set(key,val)
    return val

次のように呼び出します。

fetch('key',get_value,param1='first',param2='second')
于 2010-02-07T07:47:55.340 に答える
2

Julian のコードは非常に優れていますが、位置引数を取りません (たとえば、sorted() を使用する場合)。これが私の修正です:

def get_value(param1,param2):
    return "value %s - %s " % (str(param1),str(param2))

def fetch(key,val_function, *args, **kwargs)
    val = cache.get(key)
    if not val:
        val = val_function(*args, **kwargs)
        cache.set(key,val)
    return val
于 2010-04-01T14:05:45.037 に答える
0

キーが終了しない場合にデフォルト値を取得するには、2番目のパラメーターを指定できます。

cache.get('key', 'default')

cache.get()デフォルトの引数を取ることができます。これは、オブジェクトがキャッシュに存在しない場合に返す値を指定します。

キーが存在しない場合にデフォルト値をキャッシュに保存するには、カスタムキャッシュバックエンドを提供できます。たとえば、これはdbキャッシュバックエンドを拡張します(ただし、他の人と同じように機能します)。

from django.core.cache.backends import db

class CustomCache(db.CacheClass):

    def get(self, key, default=None):
        result = super(CustomCache, self).get(key, default)

        if result == default:
            self.add(key, default)
            return default

        return result

しかし、これが付加価値をもたらすとは思いません。

更新:
他の投稿へのコメントに応じて:はい、デフォルト値と戻り値を比較し、両方が等しい場合、値はキャッシュに追加されます。ただし、キーが まだcache.addキャッシュにない場合にのみ新しい値を設定します(常にオーバーライドするのとは対照的です)。cache.set

キーがまだ存在しない場合にのみキーを追加するには、メソッドを使用しadd()ます。と同じパラメータを取りますが、set()指定されたキーがすでに存在する場合、キャッシュの更新を試みません。

于 2010-02-06T19:06:39.577 に答える