You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jinja2 3.1.2模板语法报错及修复方案咨询

Jinja2版本兼容问题修复方案

在Jinja2 3.1.2版本中执行以下代码会抛出语法异常:

>>> print(jinja2.Template("{{ '%04d' | format(0777 - '0022' | int) }}").render())

报错信息:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/root/.virtualenvs/ansible-playbooks/lib/python3.8/site-packages/jinja2/environment.py", line 1208, in __new__
    return env.from_string(source, template_class=cls)
  File "/root/.virtualenvs/ansible-playbooks/lib/python3.8/site-packages/jinja2/environment.py", line 1105, in from_string
    return cls.from_code(self, self.compile(source), gs, None)
  File "/root/.virtualenvs/ansible-playbooks/lib/python3.8/site-packages/jinja2/environment.py", line 768, in compile
    self.handle_exception(source=source_hint)
  File "/root/.virtualenvs/ansible-playbooks/lib/python3.8/site-packages/jinja2/environment.py", line 936, in handle_exception
    raise rewrite_traceback_stack(source=source)
  File "<unknown>", line 1, in template
jinja2.exceptions.TemplateSyntaxError: expected token ',', got 'integer'

但同样的代码在Jinja2 2.11.3版本中可正常运行,输出结果为0755:

>>> print(jinja2.Template("{{ '%04d' | format(0777 - '0022' | int) }}").render())
0755

该问题源于Jinja2对表达式运算符优先级的调整,原代码中管道符|与减号-的优先级解析在新版本中发生变化,导致表达式被错误解析。

针对你的Ansible角色配置,只需为管道转换部分添加括号,明确运算优先级即可修复:

修改前的配置:

deploy_cakephp_default_umask: '0022'
deploy_cakephp_default_owner: root
deploy_cakephp_default_group: root
deploy_cakephp_default_directory_mode: "{{ '%04d' | format(0777 - deploy_cakephp_default_umask | int) }}"
deploy_cakephp_default_file_mode: "{{ '%04d' | format(0666 - deploy_cakephp_default_umask | int) }}"

修改后的配置:

deploy_cakephp_default_umask: '0022'
deploy_cakephp_default_owner: root
deploy_cakephp_default_group: root
deploy_cakephp_default_directory_mode: "{{ '%04d' | format(0777 - (deploy_cakephp_default_umask | int)) }}"
deploy_cakephp_default_file_mode: "{{ '%04d' | format(0666 - (deploy_cakephp_default_umask | int)) }}"

通过将deploy_cakephp_default_umask | int用括号包裹,确保先完成字符串转整数的操作,再执行减法运算,即可在Jinja2 3.1.2及以上版本中正常运行。

内容的提问来源于stack exchange,提问作者tersmitten

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 01:47:31