9

私のiniファイルには次のものがあります。

cache.regions = default_term, second, short_term, long_term
cache.type = memory
cache.second.expire = 1
cache.short_term.expire = 60
cache.default_term.expire = 300
cache.long_term.expire = 3600

そしてこれは私の__init__.py

from pyramid_beaker import set_cache_regions_from_settings
set_cache_regions_from_settings(settings)

ただし、ビュー/ハンドラーで実際のキャッシュを実行する方法がわかりません。利用可能なデコレータはありますか? 私は API に何かがあると考えましたが、利用できるのはユーザーにデータをキャッシュするように指示するものresponseだけです。cache_controlサーバー側にキャッシュしません。

何か案は?

4

5 に答える 5

12

私の間違いは、view-callable でデコレータ関数@cache_regionを呼び出すことでした。エラー報告はありませんでしたが、実際のキャッシュはありませんでした。だから、私のviews.pyで私は次のようにしようとしていました:

@cache_region('long_term')
def photos_view(request):
    #just an example of a costly call from Google Picasa
    gd_client = gdata.photos.service.PhotosService()
    photos = gd_client.GetFeed('...')
    return {
        'photos': photos.entry
    }

エラーもキャッシュもありません。また、view-callable は別のパラメーターを必要とし始めます! しかし、これは機能します:

#make a separate function and cache it
@cache_region('long_term')
def get_photos():
    gd_client = gdata.photos.service.PhotosService()
    photos = gd_client.GetFeed('...')
    return photos.entry

そして、view-callable では次のようにします:

def photos_view(request):
    return {
        'photos': get_photos()
    }

@cache.cache などでも同じように機能します。

要約: view-callables をキャッシュしようとしないでください

PS。ビュー callable をキャッシュできるのではないかと、まだ少し疑っています :)

UPD .: hlv が後で説明するように、view-callabe をキャッシュすると、@cache_regionは callable のリクエストパラメータをキャッシュ ID として使用するため、実際にはキャッシュがヒットすることはありません。また、リクエストはリクエストごとに一意です。

于 2011-11-27T07:03:45.183 に答える
6

ところで.. view_callable(request) を呼び出したときにうまくいかなかった理由は、後でキャッシュ内を検索するために関数パラメーターがキャッシュキーにピクルされるためです。「self」と「request」はリクエストごとに変わるため、戻り値は確かにキャッシュされますが、再度検索することはできません。代わりに、多くの役に立たないキーでキャッシュが肥大化します。

ビュー呼び出し可能内の新しい関数を定義することにより、ビュー関数の一部をキャッシュします

    def view_callable(self, context, request):

        @cache_region('long_term', 'some-unique-key-for-this-call_%s' % (request.params['some-specific-id']))
        def func_to_cache():
            # do something expensive with request.db for example
            return something
        return func_to_cache()

これまでのところうまく機能しているようです..

乾杯

于 2012-03-14T17:06:55.590 に答える
4

キャッシュリージョンを使用する必要があります。

from beaker.cache import cache_region

@cache_region('default_term')
def your_func():
    ...
于 2011-02-23T18:08:31.173 に答える
2

関数を使用しているが、結果がキャッシュされていない場合のヒント@cache_region- 関数のパラメーターがスカラーであることを確認してください。

例 A (キャッシュしない):

@cache_region('hour')
def get_addresses(person):
    return Session.query(Address).filter(Address.person_id == person.id).all()

get_addresses(Session.query(Person).first())

例 B (キャッシュする):

@cache_region('hour')
def get_addresses(person):
    return Session.query(Address).filter(Address.person_id == person).all()

get_addresses(Session.query(Person).first().id)

その理由は、関数パラメーターがキャッシュ キーとして使用されるためですget_addresses_123。オブジェクトが渡された場合、このキーは作成できません。

于 2012-04-13T01:05:44.563 に答える
1

ここでも同じ問題があります。デフォルトのパラメーターを使用してキャッシュを実行できます

from beaker.cache import CacheManager

そして、次のようなデコレータ

@cache.cache('get_my_profile', expire=60)

http://beaker.groovie.org/caching.htmlのようなものですが、ピラミッド .ini 構成で動作させる方法が見つかりません。

于 2011-02-20T01:51:02.750 に答える