zoukankan      html  css  js  c++  java
  • Flask多对多表关联后引用失败问题

    # 权限类
    class CMSPersmission(object):
        #255的二进制方式来表示 1111 1111
        ALL_PERMISSION = 0b11111111
        #1 访问者权限
        VISITOR =        0b00000001
        #2 管理帖子的权限
        POSTER =         0b00000010
        # 3 管理评论的权限
        COMMENTER =      0b00000100
        # 4 管理板块的权限
        BOARDER =        0b00001000
        # 5 管理前台用户的权限
        FRONTUSER =      0b00010000
        # 6 管理后台用户的权限
        CMSUSER =        0b00100000
        # 7 管理后台管理员的权限
        ADMINER =        0b01000000
    class CMSRole(db.Model):
        __tablename__ = 'cms_role'
        id = db.Column(db.Integer, primary_key=True, autoincrement=True)
        name = db.Column(db.String(50), nullable=False)
        desc = db.Column(db.String(200),nullable=True)
        create_time = db.Column(db.DateTime,default=datetime.now)
        permissions = db.Column(db.Integer,default=CMSPersmission.VISITOR)
    
        users = db.relationship('CMSUser',secondary=cms_role_user,backref='roles')
    class CMSUser(db.Model):
        __tablename__ = "cms_user"
        id = db.Column(db.Integer,primary_key=True,autoincrement=True)
        username = db.Column(db.String(50),nullable=False)
        _password = db.Column(db.String(100),nullable=False)
        email = db.Column(db.String(50),nullable=False,unique=True)
        join_time  = db.Column(db.DateTime,default=datetime.now)
    
        def __init__(self,username,password,email):
            self.username = username
            self.password = password
            self.email = email
    
        # 对password进行保护,使用password名字使用_password
        @property
        def password(self):
            return self._password
        # 重定义设置方法
        @password.setter
        def password(self,raw_password):
            self._password = generate_password_hash(raw_password)
    
        def check_password(self,raw_password):
            result = check_password_hash(self.password,raw_password)
            return result
    
        @property
        def permissions(self):
            if not self.roles:
                return 0
            all_permissions = 0
            for role in self.roles:
                permissions = role.permissions
                all_permissions |= permissions
            return all_permissions
    
        def has_permission(self,permission):
            # 外键的属性引用,解决undefined问题
            all_permissions = CMSPersmission.ALL_PERMISSION
            result = all_permissions&permission == permission
            return result
            # return self.permissions & permission == permission
    
        @property
        def is_developer(self):
            return self.has_permission(CMSPersmission.ALL_PERMISSION)
    # 映射
    cms_role_user = db.Table(
        "cms_role_user",
        db.Column("cms_role_id",db.Integer,db.ForeignKey("cms_role.id"),primary_key=True),
        db.Column("cms_user_id",db.Integer,db.ForeignKey("cms_user.id"),primary_key=True)
    )

    问题描述:

     问题分析:

    打开mysql查询表结构:

     打开cms_role_user:

     关联正常,问题出在函数has_permission上:

    return self.permissions & permission == permission
    问题解决
  • 相关阅读:
    『Power AI by AI』 PAI-AutoML2.0重磅发布
    基于 K8s 做应用发布的工具那么多, 阿里为啥选择灰姑娘般的 Tekton ?
    编码方法论,赋能你我他
    开发部署效率提升 12 倍,这款应用托管服务让云上运维更简单
    全景还原报错现场 | 应用实时监控 ARMS 上线用户行为回溯功能
    告别诊断烦恼 | 应用实时监控 ARMS 上线智能和实时诊断功能
    阿里云CDN上线 WAF,一站式提供分发+安全能力
    RDS for PostgreSQL 云盘加密功能使用方法
    MySQL8.0.17
    2370 小机房的树
  • 原文地址:https://www.cnblogs.com/Knight66666/p/13111585.html
Copyright © 2011-2022 走看看