どうやら、それは一般的な問題のはずです。
私のFlaskアプリケーションには、各リクエストの後にSQLAlchemyセッションをコミットする(リクエストが正常に処理された場合)またはロールバックする(リクエスト処理が失敗した場合)ミドルウェアがあります。DB の一部のオブジェクトのキャッシュを実装する必要があります。たとえば、ユーザーとしましょう。
手動の無効化を実装したいので、User オブジェクトを変更するときはキャッシュから削除する必要があります。次のリクエストでユーザーが必要で、キャッシュに見つからない場合は、DB とキャッシュから取得します。
OK、User オブジェクトを変更してフラッシュしました (コードの次の部分が失敗する可能性があり、トランザクションを元に戻す必要があるため、まだコミットしていません)。トランザクションの操作はまだ保留モードであるため、キャッシュ内のオブジェクトをすぐに無効にすることはできないようです。他の誰かがユーザーの情報にアクセスしようとしても、キャッシュ内で彼を見つけられないため、DB から古いユーザーを取得してキャッシュします. したがって、トランザクションがコミットされた後にのみ、ユーザーをキャッシュから削除する必要があります。
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シグナルを使用できますか?