Flask 缓存设置方法抛出 KeyError?
Flask cache set method throwing KeyError?
为了缓存一些数据,我调用了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,但在 SomeRouter 模块中导入和使用时,相同的缓存对象抛出 KeyError。会不会是我导入对象的方式不对?我还尝试在使用之前导入缓存对象,但没有成功。知道这里发生了什么吗?
问题是我在请求上下文之外访问 cache
对象,即在 "SomeRouter"
模块中,因此它不知道它是在哪个上下文中使用的。
在接收到请求的server
模块中,缓存知道应用程序应用程序,但在SomeRouter
模块中的cache.set(cKey, data)
期间,它抛出KeyError。如上所述,这个错误是有道理的。
解决方案是推送应用上下文如下:
from server import app, cache
# Using context
with app.app_context():
cache.set(cKey, data)
这会推送一个新的应用上下文(使用app的应用)。
感谢Mark Hildreth, for his great answer on context in flask
为了缓存一些数据,我调用了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,但在 SomeRouter 模块中导入和使用时,相同的缓存对象抛出 KeyError。会不会是我导入对象的方式不对?我还尝试在使用之前导入缓存对象,但没有成功。知道这里发生了什么吗?
问题是我在请求上下文之外访问 cache
对象,即在 "SomeRouter"
模块中,因此它不知道它是在哪个上下文中使用的。
在接收到请求的server
模块中,缓存知道应用程序应用程序,但在SomeRouter
模块中的cache.set(cKey, data)
期间,它抛出KeyError。如上所述,这个错误是有道理的。
解决方案是推送应用上下文如下:
from server import app, cache
# Using context
with app.app_context():
cache.set(cKey, data)
这会推送一个新的应用上下文(使用app的应用)。
感谢Mark Hildreth, for his great answer on context in flask