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

查看:162
本文介绍了flask-sqlalchemy - flask用户注册时实现注册为不同权限的用户的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

用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()

解决方案

你也是看那本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一样的时候,就会被分配为管理员

这篇关于flask-sqlalchemy - flask用户注册时实现注册为不同权限的用户的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆