Jinja2 的 AND 操作顺序?

Order of AND Operations for Jinja2?

我想验证 current_user 对象是否在其角色设置中具有 'Admin' 以限制点击出现在 Jinja2 中。

但是,如果我大部分时间只使用{% if 'Admin' in current_user.format()['roles'] %},它会给我错误

current_user is Non-type object

所以,我使用了以下语法,它在本地对我有用。

{% if current_user.is_authenticated and ('Admin' in current_user.format()['roles']) %}

    ...
    ...
    ...

{% endif %}

唯一的问题是我不确定 Jinja2 的 AND 运算顺序,恐怕 AND 运算符后的第二个条件 会先 运行 ,如果我在生产服务器中继续执行此代码,这会给我带来麻烦。

所以我的问题是:

是否有关于 Jinja2 中操作顺序的文档,或任何其他可靠的参考资料?或者谁知道操作顺序是否总是从左边开始?

下面的模型是 class,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'))

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

Jinja2 docs don't seem to state directly whether Jinja2 supports short-circuit evaluation with and and or. The best indication I can find that it does is within the AST extension, where the And class被称为'Short circuited AND'。

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

的内容
{% if condition_A and condition_B %}

如果 condition_B 会在 condition_A 为 false 时引发异常。