如何使用Flask为Jinja2模板提供类变量?

2024-04-26 14:24:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个使用flask登录的模板,我有一个基于位集的权限模型。在我的模板中,我希望根据权限公开页面中的内容。我的用户模型中有一个函数can(permission),它控制用户可以做什么。

class User(UserMixin, db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(64), unique=True)
    fullname = db.Column(db.String(75))
    password_hash = db.Column(db.String(128))
    role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))

    @property
    def password(self):
        raise AttributeError('password is not a readable attribute')

    @password.setter
    def password(self, password):
        self.password_hash = generate_password_hash(password)

    def verify_password(self, password):
        return check_password_hash(self.password_hash, password)

    def can(self, permissions):
        return self.role is not None and (self.role.permissions & permissions) == permissions

    def __repr__(self):
        return '<User: {}>'.format(self.email)

class Permission:
    FOLLOW = 0x01
    COMMENT = 0x02
    WRITE_ARTICLES = 0x04
    MODERATE_COMMENTS = 0x08
    ADMINISTER = 0x80

当我试图调用模板中的can()函数并向其传递权限时,我得到一个错误,即未定义权限,这可能是因为权限类不在模板的作用域中。以下是所有其他模板扩展的my base.html的一部分:

{% if current_user.can(Permission.ADMINISTER) %}
<h3>Administration</h3>
<ul>
    <li><a href="{{ url_for('main.add_user') }}">Add User</a></li>
    <li><a href="{{ url_for('main.change_password') }}">Change Password</a></li>
    <li><a href="{{ url_for('main.lock_user') }}">Lock User</a></li>
</ul>
{% endif %}

我对米格尔·格林伯格(Miguel Grinberg)写的关于Flask Web开发的书没有什么兴趣,他在他的base.html (line 32)中也做了同样的事情。

如何将权限类提供给模板?


Tags: self模板id权限permissionsdbstringdef