fix: acl cache

This commit is contained in:
pycook 2023-10-23 13:57:06 +08:00
parent 819b994c2d
commit 0ac14fa318
2 changed files with 8 additions and 4 deletions

View File

@ -8,6 +8,7 @@ from flask import current_app
from flask import request from flask import request
from sqlalchemy.exc import InvalidRequestError from sqlalchemy.exc import InvalidRequestError
from sqlalchemy.exc import OperationalError from sqlalchemy.exc import OperationalError
from sqlalchemy.exc import PendingRollbackError
from sqlalchemy.exc import StatementError from sqlalchemy.exc import StatementError
from api.extensions import db from api.extensions import db
@ -98,7 +99,10 @@ def reconnect_db(func):
def _flush_db(): def _flush_db():
db.session.commit() try:
db.session.commit()
except (StatementError, OperationalError, InvalidRequestError, PendingRollbackError):
db.session.rollback()
def flush_db(func): def flush_db(func):

View File

@ -4,7 +4,7 @@
import msgpack import msgpack
from api.extensions import cache from api.extensions import cache
from api.extensions import db from api.lib.decorator import flush_db
from api.lib.utils import Lock from api.lib.utils import Lock
from api.models.acl import App from api.models.acl import App
from api.models.acl import Permission from api.models.acl import Permission
@ -221,9 +221,9 @@ class RoleRelationCache(object):
return msgpack.loads(r_g, raw=False) return msgpack.loads(r_g, raw=False)
@classmethod @classmethod
@flush_db
def rebuild(cls, rid, app_id): def rebuild(cls, rid, app_id):
cls.clean(rid, app_id) cls.clean(rid, app_id)
db.session.remove()
cls.get_parent_ids(rid, app_id) cls.get_parent_ids(rid, app_id)
cls.get_child_ids(rid, app_id) cls.get_child_ids(rid, app_id)
@ -235,9 +235,9 @@ class RoleRelationCache(object):
cls.get_resources2(rid, app_id) cls.get_resources2(rid, app_id)
@classmethod @classmethod
@flush_db
def rebuild2(cls, rid, app_id): def rebuild2(cls, rid, app_id):
cache.delete(cls.PREFIX_RESOURCES2.format(rid, app_id)) cache.delete(cls.PREFIX_RESOURCES2.format(rid, app_id))
db.session.remove()
cls.get_resources2(rid, app_id) cls.get_resources2(rid, app_id)
@classmethod @classmethod