Как пропустить кэш Flask при ошибках шаблона - PullRequest
1 голос
/ 12 марта 2019

Я использую Flask с кэшированием шаблонов на сервере Redis:

TIMEOUT = 60 * 60
cache = Cache(app.server, config={
    'CACHE_TYPE': 'redis',
    'CACHE_REDIS_HOST': "myredis",
    'CACHE_DEFAULT_TIMEOUT': TIMEOUT,
    'CACHE_REDIS_PORT': 6379,
})
# to disable caching
#app.config["CACHE_TYPE"] = "null"

и затем с помощью декоратора @cache, например

@cache.memoize(timeout=TIMEOUT)
def update_date():
    return manager.getData()

Проблема в том, что когда manager.getData() содержит ошибки или не содержит данных, декоратор все равно будет кэшировать ответ. Как этого избежать?

[UPDATE]

Я попытался использовать параметр unless, согласно документам это должно быть

unless – Default None. Cache will always execute the caching facilities unelss this callable is true. This will bypass the caching entirely.

так используется как

@cache.memoize(timeout=TIMEOUT unless=DataLoader.instance.hasData)
    def update_date():
        return manager.getData()

, где DataLoader - это экземпляр Singleton, а метод hasData вернет None, если у него нет данных, или True, если у него есть данные, поэтому метод getData будет вычислять данные и возвращать переменную экземпляра * 1026. * который всегда содержит последние вычисленные данные или None.

class DataLoader(SingletonMixin):

    def __init__(self):
        self.data=None
    def hasData(self):
        if self.data is Not None:
            return True
        else:
            return None
    def getData(self):
        # calculate data
        res = self.computeData()
        if res is not None:
            self.data=res
        return self.data

но похоже, что он работает не так, как ожидалось.

1 Ответ

1 голос
/ 12 марта 2019

Проблема в том, что когда manager.getData () имеет ошибки или не содержит данных, декоратор все равно будет кэшировать ответ.Как этого избежать?

Вы это проверяли?Если вы посмотрите на исходный код (я предполагаю, что вы используете flask-caching, потому что flask-cache не поддерживается более 4 лет), если вы получаете None из кэша (значение rv), вы получаетене используйте его, вы вызываете вашу f функцию.Если функция f вызывает исключение, в кеш ничего не сохраняется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...