【问题标题】:Order of AND Operations for Jinja2?Jinja2 的 AND 操作顺序?
【发布时间】: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'] 被格式化为数组类型

标签: python jinja2


【解决方案1】:

您所指的概念称为short-circuit evaluation。在支持短路求值的语言中,如果你有一个表达式,例如condition_A and condition_B,而condition_A 被证明为假,那么condition_B 根本不会被求值,即使condition_B 会引发一个例外。

Jinja2 docs 似乎没有直接说明 Jinja2 是否支持 andor 的短路评估。我能找到的最好的指示是在AST 扩展中,And class 被称为“短路与”。

短路评估是许多语言(包括 Python)使用的约定,所以我会说你可以安全地编写类似的东西

{% if condition_A and condition_B %}

如果您的condition_B 会在condition_A 为假时引发异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-15
    • 2013-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多