【发布时间】:2014-09-20 06:23:58
【问题描述】:
此代码再次来自 Miguel Grindberg 的书“Flask Web Development”。在 models.py 中,我们有 3 个类,一个 Role 类,它有 3 个角色(User、Moderator、Administrator)、一个 User 类(id、username、email、role_id、password_hash、confirmed)和一个 Permsission 类(代码如下)。在 chp 9 第 114 页中,他向 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()
我的问题是,为什么我们需要这个代码的构造函数?文件的任何其他部分都没有使用构造函数(下面的完整代码),那么为什么我们现在需要一个呢?我在 Stack (Flask-SQLAlchemy Constructor) 上查看了这个问题,它对基类构造函数的主题有所了解,但并不是为什么我需要为这段代码使用构造函数。 .再次感谢您的帮助。
class Permission:
FOLLOW = 0x01
COMMENT = 0x02
WRITE_ARTICLES = 0x04
MODERATE_COMMENTS = 0x08
ADMINISTER = 0x80
class Role(db.Model):
__tablename__ = 'roles'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
default = db.Column(db.Boolean, default=False, index=True)
permissions = db.Column(db.Integer)
users = db.relationship('User', backref='role', lazy='dynamic')
@staticmethod
def insert_roles():
roles = {
'User': (Permission.FOLLOW |
Permission.COMMENT |
Permission.WRITE_ARTICLES, True),
'Moderator': (Permission.FOLLOW |
Permission.COMMENT |
Permission.WRITE_ARTICLES |
Permission.MODERATE_COMMENTS, False),
'Administrator': (0xff, False)
}
for r in roles:
role = Role.query.filter_by(name=r).first()
if role is None:
role = Role(name=r)
role.permissions = roles[r][0]
role.default = roles[r][1]
db.session.add(role)
db.session.commit()
def __repr__(self):
return '<Role %r>' % self.name
class User(UserMixin, db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(64), unique=True, index=True)
username = db.Column(db.String(64), unique=True, index=True)
role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
password_hash = db.Column(db.String(128))
confirmed = db.Column(db.Boolean, default=False)
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()
【问题讨论】:
标签: python python-2.7 flask sqlalchemy flask-sqlalchemy