【发布时间】:2022-01-15 18:26:33
【问题描述】:
我想验证 current_user 对象是否在其角色中设置了 'Admin' 以限制点击出现在 Jinja2 中。
但是,如果我大部分时间只使用{% if 'Admin' in current_user.format()['roles'] %},它会报错
current_user 是非类型对象
所以,我使用了以下语法,它在本地对我有用。
{% if current_user.is_authenticated and ('Admin' in current_user.format()['roles']) %}
...
...
...
{% endif %}
唯一的问题是我不确定 Jinja2 的 AND 操作顺序,我担心 AND 运算符之后的第二个条件会先运行,如果我这样做会给我带来麻烦在生产服务器中继续执行此代码。
所以我的问题:
是否有关于 Jinja2 中操作顺序的文档,或任何其他可靠的参考资料?或者如果有人知道操作顺序是否总是从左边开始?
下面的模型是current_user继承自的类:
class Authorization(db.Model, UserMixin):
__tablename__ = 'authorizations'
id = db.Column(db.Integer, primary_key=True)
active = db.Column('is_active', db.Boolean(), nullable=False, server_default='0')
# User authentication information. The collation='NOCASE' is required
# to search case insensitively when USER_IFIND_MODE is 'nocase_collation'.
username = db.Column(db.BigInteger, nullable=False, unique=True)
password = db.Column(db.String(255), nullable=False, server_default='')
# Define the relationship to Role via UserRoles
roles = db.relationship('Role', secondary='user_roles')
def format(self):
roles = [role.name for role in self.roles]
print(roles)
return {
'id': self.id,
'active': self.active,
'username': self.username,
'roles': roles,
}
# Define the Role data-model
class Role(db.Model):
__tablename__ = 'roles'
id = db.Column(db.Integer(), primary_key=True)
name = db.Column(db.String(50), unique=True)
# Define the UserRoles association table
class UserRoles(db.Model):
__tablename__ = 'user_roles'
id = db.Column(db.Integer(), primary_key=True)
user_id = db.Column(db.Integer(), db.ForeignKey('authorizations.id', ondelete='CASCADE'))
role_id = db.Column(db.Integer(), db.ForeignKey('roles.id', ondelete='CASCADE'))
【问题讨论】:
-
@KlausD。
current_user.format()['roles']被格式化为数组类型