Flask метод кеширования, выбрасывающий KeyError? - PullRequest
3 голосов
/ 10 января 2020

Для кеширования некоторых данных я вызываю метод cache.set. Однако это бросает KeyError. Журнал ошибок:

 File "D:\Sample_Project\SomeRouter.py", line 176, in run
    FetchFeed._prepareCache(f_content, cache, _program, _sprint)
  File "D:\Sample_Project\SomeRouter.py", line 197, in _prepareCache
    cache.set(cKey, data[last_index:last_index + MAX_DATA_PER_PAGE])
  File "c:\python\lib\site-packages\flask_caching\__init__.py", line 254, in set
    return self.cache.set(*args, **kwargs)
  File "c:\python\lib\site-packages\flask_caching\__init__.py", line 246, in cache
    return app.extensions["cache"][self]
KeyError: <flask_caching.Cache object at 0x04F9C8D0>

Модуль сервера выглядит следующим образом:

cache_type = 'simple' if 'FLASK_ENV' in os.environ and os.environ['FLASK_ENV'] == 'development' else 'uwsgi'
cache = Cache(config={'CACHE_TYPE': cache_type})
app = Flask("MY_PROJECT")
cache.init_app(app)

# some api.route functions
# goes here ....

if __name__ == "__main__":
    with app.app_context():
        cache.clear()
    app.run(host="0.0.0.0")

И модуль SomeRouter:

from server import cache

@staticmethod
def _prepareCache(data, cache, program):
    total_records = len(data)
    if total_records > 0:
        cKey = FetchFeed \
            ._constructCacheKey(program)
        cache.set(cKey, data)
    else:
        print("data size is empty.")

Примечание: я удалил ненужные коды.

Я также установил точки останова и вызвал cache.set (some_key, some_value) в самом модуле сервера. Он возвращает True, но тот же объект кэша выдает KeyError при импорте и использовании в модуле SomeRouter. Может ли быть так, что я импортирую объект неправильно? Я также попытался импортировать объект кэша прямо перед его использованием, но он не работал. Есть идеи, что здесь происходит?

1 Ответ

2 голосов
/ 15 января 2020

Проблема заключалась в том, что я обращался к объекту cache вне контекста запроса, т.е. в модуле "SomeRouter", и из-за этого он не знал, в каком контексте он используется.

В server модуле Когда запрос получен, кеш знает о приложении, но во время cache.set(cKey, data) в модуле SomeRouter он выдает KeyError. Эта ошибка оправдана, как упомянуто выше.

Разрешение равно pu sh контексту приложения, как показано ниже:

from server import app, cache

# Using context
with app.app_context():
    cache.set(cKey, data)

Это будет pu sh новым контекстом приложения (с использованием приложение из приложения).

Все благодарности Марку Хилдрету , за его великолепный ответ о контексте в flask

...