Если вы сконфигурируете beaker для сохранения в файловой системе, вы можете легко увидеть, что каждый аргумент также выбирается. Пример:
tp3
sS'tags <myapp.controllers.tags.TagsController object at 0x103363c10> <MySQLdb.cursors.Cursor object at 0x103363dd0> apple'
p4
Обратите внимание, что «ключ» кэша содержит не только мое ключевое слово «яблоко», но и информацию, специфичную для экземпляра. Это довольно плохо, потому что особенно «я» не будет одинаковым при всех вызовах. Кэш будет каждый раз пропускать (и заполняться бесполезными ключами.)
Метод с аннотацией кеша должен только иметь аргументы, соответствующие любому «ключу», который вы имеете в виду. Перефразируя это, предположим, что вы хотите сохранить тот факт, что «Джон» соответствует значению 555-1212, и вы хотите его кэшировать. Ваша функция не должна принимать ничего, кроме строки в качестве аргумента. Любые аргументы, которые вы передаете, должны оставаться постоянными от вызова к вызову, поэтому что-то вроде «я» будет плохим.
Один простой способ сделать эту работу - встроенная функция, чтобы вам не нужно было передавать что-либо еще кроме ключа. Например:
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