看来,这应该是一个普遍的问题。
我的 Flask 应用程序具有在每个请求后提交(如果请求处理正常)或回滚(如果请求处理失败)SQLAlchemy 会话的中间件。我需要为数据库中的某些对象实现缓存,比如说用户。
我想实现手动失效,所以当我更改用户对象时,我应该将它从缓存中删除。如果下一个请求需要用户并且在缓存中找不到,它会从数据库和缓存中检索它。
好的,我更改了 User 对象并刷新它(还没有提交,因为下一部分代码可能会失败并且应该恢复事务)。看来,我不能立即使缓存中的对象无效,因为事务的操作仍处于挂起模式,所以如果其他人试图访问用户的信息,他不会在缓存中找到他,所以将从数据库中检索过时的用户并缓存他. 所以我只需要在事务提交后从缓存中删除用户。
我考虑过在数据库事务提交后放置有关用户需要从缓存中删除并在中间件中执行删除的信息:
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 信号?