def template(path, data, sub=None):
"""
:param path: 输入yml文件路径
:param data: 需要更换的模板变量
:param sub: 是对yml数据的二次提取,获取某个嵌套字典中的变量值替换,可以有多个接口数据替换
:return: 返回替换变量后的模板数据
"""
with open(path, encoding='utf-8') as f:
if sub is None:
# yaml.safe_load把yml格式的字符串变成dict类型返回
return yaml.safe_load(Template(f.read()).substitute(data))
else:
# 由于Template需要替换全部的变量,有漏的就会报错,先写Template(f.read()).substitute(data),先把文件的中想要转换的yml数据转换为字典,在导出为yml格式
data = Template(yaml.safe_dump(yaml.safe_load(f)[sub])).substitute(data)
return yaml.safe_load(data)
yml模板
create:
"method": "post"
"url": "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/add_corp_tag?"
"params": "access_token=$token"
"json":
"group_id": "etMCs1DwAAg_jBNAug"
"tag":
- "name": "$name"
过程:当name=""时,最后返回结果会变成None,期望的返回空字符串
datas = {"token": "212134", "name": ""}
a = template('text.yml', datas,"create")
结果:
{'json': {'group_id': 'etMCs1DwAAg_jBNAuvGR3B21cwl4o0jg', 'tag': [{'name': None}]}, 'method': 'post', 'params': 'access_token=212134', 'url': 'https://qyapi.weixin.qq.com/cgi-bin/externalcontact/add_corp_tag?'}
怎么解决
用string.Template替换它会把空字符换成None,要解决的话可以使用一个空字符标识,先替换成特殊字符,在template后再替换成空字符。
这边建议直接使用这样的替换方法
from jinja2 import Template
def template_replace(template_str, data):
template = Template(template_str)
result = template.render(data)
return result
template_str = "{'json': {'group_id': 'etMCs1DwAAg_jBNAug', 'tag': [{'name': {{name}}]}, 'method': 'post', 'params': 'access_token={{token}}', 'url': 'https://qyapi.weixin.qq.com/cgi-bin/externalcontact/add_corp_tag?'}"
data = {"token": "123124141", "name": ""}
output = template_replace(template_str, data)
print(output)