似乎,这应该是一个常见的问题。
我的Flask应用程序有中间件提交(如果请求正常处理)或回滚(如果请求处理失败)每个请求后的SQLAlchemy会话。我需要为DB中的某个对象实现缓存,比方说User。
我想实现手动失效,所以当我更改User对象时,我应该从缓存中删除它。如果下一个请求需要User并且在缓存中找不到它,它将从DB和缓存中检索它。
好的,我更改了User对象并刷新它(还没有提交,因为代码的下一部分可能会失败并且应该恢复事务)。似乎,我不能立即使缓存中的对象无效,因为事务的操作仍然处于挂起模式,所以如果其他人将尝试访问用户的信息,他将不会在缓存中找到他,因此将从DB中检索过时的用户并缓存他。所以我需要在事务提交后才从缓存中删除User。
我考虑过在DB事务提交后将有关用户需求的信息从缓存中移除并在中间件中执行删除:
class DbSessionMiddleware:
def __init__(self, flask_app):
self.app = flask_app.wsgi_app
def __call__(self, environ, start_response):
try:
return self.app(environ, start_response)
except BaseException:
dbs().rollback()
raise
finally:
dbs().commit()
# Check if error occurred and reset cache, if not?
我在思考正确的方向吗?如何将数据传递给中间件?
可能是,为此使用Flask-SQLAlchemy信号?