flask用户注册时实现注册为不同权限的用户

sirius123
  • 18

用flask搭建一个博客系统,想实现权限控制,定义了Role和User模型

#定义角色模型,只分为两个角色,管理员和普通用户,普通用户能够创建文章,管理员用户能够创建用户
class Role(db.Model):
    __tablename__ = "roles"                     #数据库中表的名字

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(64), unique=True)

    # user_id = db.Column(db.Integer, db.ForeignKey("users.id"))
    #users = db.relationship("User", backref=db.backref('role',lazy='dynamic'))
    users = db.relationship('User', backref='role')


    def __repr__(self):
        return '<Role %r>' % self.name

#定义用户
class User(db.Model, UserMixin):
    __tablename__ = "users"

    id = db.Column(db.Integer, primary_key=True)
    userName = db.Column(db.String(30), unique=True)
    Shadow = db.Column(db.String(50))
    #email = db.Column(db.String(120), unique=True)

    # 一对多关系映射,一个Role包含多个User
    role_id = db.Column(db.Integer, db.ForeignKey("roles.id"))
    #role = db.relationship('Role', backref=db.backref('user_rever',lazy='dynamic'))

    #将password字段定义为User类的一个属性,其中设置该属性不可读,若读取抛出AttributeError。
    @property
    def password(self):
        raise AttributeError('password cannot be read')

    #定义password字段的写方法,我们调用generate_password_hash将明文密码password转成密文Shadow
    @password.setter
    def password(self, password):
        self.Shadow = generate_password_hash(password)

    #定义验证密码的函数confirm_password
    def confirm_password(self, password):
        return check_password_hash(self.Shadow, password)

    def __repr__(self):
        return '<User %r>' % self.userName

然后定义了管理员角色和普通用户角色

admin_role = Role(name='Admin') 
user_role = Role(name='User')

在交互式shell中可以简单的定义新用户


user_pi = User(userName='pi', password="123", role=user_role)
user_luffy = User(userName='luffy', password="shadow",role=user_role)
db.session.add(user_pi)
db.session.add(user_luffy)
db.session.commit()

但是在views该怎么写

这样写的话会报错

user = User(userName=username, password=password1, role=Role(name='Admin'))
db.session.add(user)
db.session.commit()

图片描述

回复
阅读 3.8k
2 个回答

你也是看那本Flask Web开发吧,要搭建一个自己用的博客,其实按照书里的来就够了,不需要新建角色,书里的代码在config.py文件里面设置了一个FLASKY_ADMIN,然后在models.py文件里面的User部分的代码那里有这一段:

def __init__(self, **kwargs):
        super(User, self).__init__(**kwargs)
        if self.role is None:
            if self.email == current_app.config['FLASKY_ADMIN']:
                self.role = Role.query.filter_by(permissions=0xff).first()
            if self.role is None:
                self.role = Role.query.filter_by(default=True).first()
        if self.email is not None and self.avatar_hash is None:
            self.avatar_hash = hashlib.md5(
                self.email.encode('utf-8')).hexdigest()

这一段就是用来处理一般用户跟管理员的,当你注册的email跟FLASKY_ADMIN一样的时候,就会被分配为管理员

你在shell创建name为Admin的角色

admin_role = Role(name='Admin')  
user_role = Role(name='User')  

db.session.commit(admin_role)了吗?

如果没有,你在

user = User(userName=username, password=password1, role=Role(name='Admin'))
db.session.add(user)
db.session.commit()

会找不到role的数据

建议你把报错贴出来

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏