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 时引发异常。
我想验证 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 时引发异常。