如何用pymsteams与Jinja2在Teams发送含循环数据的单条模板消息
问题描述
我使用pymsteams和Jinja2模板向Microsoft Teams发送消息,现有代码如下:
def method_create_template(data): for t in data: name=t['name'] age=t['age'] with open("directory/file.html",'r') as files: files = Template(files.read()) files=files.render(data1=name,data2=age) myTeamsMessage = pymsteams.connectorcard(url) myTeamsMessage.title("title") myTeamsMessage.text(files) myTeamsMessage.color("FF0000") response = myTeamsMessage.send() print("message sent")
目前消息可正常发送,但需求是发送一条包含所有循环数据的消息,而非循环逐条发送。我的循环数据为[{"name":"putta","age":"25"},{"name":"xyz","age":"80"}],当前使用的模板如下:
<table ><tr><th>name</th><th>age</th></tr><td>{{data1}}</td><td><a href="{{data2}}"></a>{{data2}}</td></table>
当前要么生成多个独立表格,要么移出循环后仅显示单条数据,期望输出是包含所有数据的统一表格:
name age putta 25 xyz 80 abc 90
请问如何修改代码实现该需求?
解决方案
1. 调整Python代码逻辑
将循环发送消息的逻辑移除,改为一次性将完整数据列表传给模板,仅发送一次Teams消息:
def method_create_template(data): # 读取模板文件并初始化Jinja2模板 with open("directory/file.html", 'r') as file: template = Template(file.read()) # 将整个数据列表传入模板渲染 rendered_content = template.render(people=data) # 创建并发送单条Teams消息 myTeamsMessage = pymsteams.connectorcard(url) myTeamsMessage.title("统一数据汇总") myTeamsMessage.text(rendered_content) myTeamsMessage.color("FF0000") response = myTeamsMessage.send() print("消息已发送")
2. 修改Jinja2模板
利用Jinja2的循环语法,在模板内遍历所有数据生成完整表格:
<table> <tr> <th>name</th> <th>age</th> </tr> {% for person in people %} <tr> <td>{{ person.name }}</td> <td>{{ person.age }}</td> </tr> {% endfor %} </table>
补充说明
- 代码层面:不再循环创建和发送消息,而是一次性传递全部数据,让模板处理多行内容的生成。
- 模板层面:通过
{% for %}遍历传入的people列表,为每个数据项生成一行表格内容,最终得到包含所有数据的单个表格。 - 若需保留age字段的链接,可将模板中的
<td>{{ person.age }}</td>修改为<td><a href="{{ person.age }}">{{ person.age }}</a></td>(需确保age字段适合作为URL使用)。
内容的提问来源于stack exchange,提问作者putta
相关产品推荐
相关产品推荐

