dify节点分析:模板转换
摘要:本文介绍了Jinja模板语言在dify的模板转换节点中的使用。重点解析了如何通过嵌套循环遍历JSON数据,其中外层循环处理events数组,内层循环处理profile_delta数组。详细说明了控制结构{%...%}和表达式{{...}}的用法,包括如何输出事件ID(event.id)和内容项(item.content)。通过示例代码演示了如何将JSON数据转换为格式化输出,并强调了Jinj
·
模板转换
只支持Jinja,一种python模板语言
某个节点的输出内容如下


可以看到,在text中没有内容,也就是说,我们传统的在直接回复中填入text输出相关内容的方式没用。
而且,你无法在直接回复中输出上个节点的json内容,此时我们想要输出json中的events该如何做?
此时需要利用一个节点:模板转换,该节点仅支持Jinja模板语言
Jinja 原本是 Python 的模板引擎,最初是为 Flask 框架开发的,功能非常强大,可以动态生成网页,XML,CSV 或者 Markdown 文本。
所以,在实际项目中,利用模板转换的功能,将中间数据,通过模板渲染成需要的格式,才能体现它真正的威力,千万不要被本文例子中的简单写法迷惑,觉得它过于简单哦。
下面是一个输出event中的content内容的示例

1. {% for event in arg1[0]["events"] %}
2. 事件ID:{{ event.id }},
3. 内容:
4. {% for item in event.event_data.profile_delta %}
5. {{ item.content }}
6. {% endfor %}
7. <br>
8. {% endfor %}
1. {% ... %}:控制结构
{% ... %}用于定义 Jinja2 的控制结构,例如循环、条件判断、变量赋值等。- 在你的代码中,
{% for ... %}和{% endfor %}是一对循环标签,表示一个for循环的开始和结束。
**第一行:{% for event in arg1[0]["events"] %}
- 作用:遍历
arg1[0]["events"]中的每个元素,并将其赋值给变量event。 - 解释:
-
arg1是一个输入变量,假设它是一个 JSON 数组,其中第一个元素是一个对象,包含一个名为"events"的键。arg1[0]["events"]表示获取arg1中第一个对象的"events"键对应的值,假设这是一个数组。for event in arg1[0]["events"]表示对这个数组中的每个元素进行遍历,每次迭代时,当前元素被赋值给变量event。
**第八行:{% endfor %}
- 作用:表示
for循环的结束。 - 解释:与开头的
{% for ... %}配对,标志着循环体的结束。
2. {{ ... }}:表达式
{{ ... }}用于在模板中插入动态内容,即渲染变量或表达式的值。- 在你的代码中,
{{ ... }}用于输出变量的值。
**第二行:事件ID:{{ event.id }}
- 作用:输出当前
event对象的id属性。 - 解释:
-
event是在for循环中定义的变量,表示当前正在遍历的arg1[0]["events"]数组中的一个元素。event.id表示访问event对象的id属性,并将其值插入到模板中。
**第五行:{{ item.content }}
- 作用:输出当前
item对象的content属性。 - 解释:
-
item是在内层for循环中定义的变量,表示当前正在遍历的event.event_data.profile_delta数组中的一个元素。item.content表示访问item对象的content属性,并将其值插入到模板中。
3. 嵌套循环
- 你的代码中存在两层
for循环:
-
- 外层循环:
{% for event in arg1[0]["events"] %},遍历arg1[0]["events"]数组。 - 内层循环:
{% for item in event.event_data.profile_delta %},遍历当前event对象的event_data.profile_delta数组。
- 外层循环:
**第四行:{% for item in event.event_data.profile_delta %}
- 作用:遍历当前
event对象的event_data.profile_delta数组,并将其每个元素赋值给变量item。 - 解释:
-
event.event_data.profile_delta表示当前event对象中的一个数组,假设它存储了一些与事件相关的数据。for item in event.event_data.profile_delta表示对这个数组中的每个元素进行遍历,每次迭代时,当前元素被赋值给变量item。
**第六行:{% endfor %}
- 作用:表示内层
for循环的结束。 - 解释:与内层循环的开头
{% for ... %}配对,标志着内层循环体的结束。
4.普通文本
- 模板中的普通文本(非
{% ... %}或{{ ... }}的部分)会被直接输出到最终结果中。 - 例如:
-
- 第三行:
内容:是普通的文本,会原样输出。 - 第七行:
<br>是 HTML 标签,用于换行,也会原样输出。
- 第三行:
完整逻辑分析
- 外层循环:
-
- 遍历
arg1[0]["events"]数组中的每个事件。 - 每次迭代时,当前事件被赋值给变量
event。
- 遍历
- 输出事件 ID:
-
- 使用
{{ event.id }}输出当前事件的id属性。
- 使用
- 内层循环:
-
- 遍历当前事件的
event_data.profile_delta数组中的每个项。 - 每次迭代时,当前项被赋值给变量
item。
- 遍历当前事件的
- 输出内容:
-
- 使用
{{ item.content }}输出当前项的content属性。
- 使用
- 换行:
-
- 使用
<br>标签在每次外层循环结束后换行,以便清晰地分隔不同事件的内容。
- 使用
更多推荐


所有评论(0)