Jinja2的一般工作流程是params + Jinja2模板=生成的文档。
from jinja2 import Template
t = Template("Hello {{ something }}!")
t.render(something="World")
>>> u'Hello World!'
是否可以使用Jinja2模板对文档中的参数进行反向工程?换句话说,我正在寻找以下内容:Jinja2模板+生成的文档= params。
from jinja2 import Template
t = Template("Hello {{ something }}!")
t.reverse("Hello World!")
>>> {"something" : "World"}
json输出不是必需的,但是很方便。
如果不是,那么创建这种逻辑的好方法是什么?
内容:
我使用Jinja2生成Cisco Switch配置文件,并且能够提取过去生成的文档将是一个很好的功能,并且我不想列出1000多个行配置脚本,而是仅列出参数。我知道可以通过将所有参数存储在一个简单的数据库中来解决它,但是目前我没有建立数据库,如果可能的话,我会避免使用它。
最佳答案
这行得通,但是它只是提取所有参数,不给您顺序,也不告诉它们如何关联:
import textfsm
import tempfile
import re
import pprint
j2template = open(<template_file_path>)
find_txt = '(\{\{.+?\}\})'
all_variables = re.findall(find_txt, j2template.read())
variable_set = set()
for variable in all_variables:
variable_set.add( variable )
value_block_txt = ''
for value in variable_set:
value = value.replace('.', '')
value_block_txt += "Value List {val_text} (\S+)\n".format(val_text = value.strip('{}\ '))
fsm_regex_block = '''
Start
'''
j2template = open(<filepath>)
for line in j2template.readlines():
replace_list = [var for var in variable_set if(var in line)]
if len(replace_list) > 0:
for string in replace_list:
line = line.replace(string, "${"+string.replace('.', '').strip('{}. ')+"}")
line = " ^"+line
fsm_regex_block += line
textfsm_template = value_block_txt
textfsm_template += fsm_regex_block
f = open(<temp_file_path>, 'w+')
f.write(textfsm_template)
f.close()
fsm = textfsm.TextFSM(open(<temp_file_path>))
original_variables_list_of_lists = fsm.ParseText(jinja_device_config_output)
print(original_variables_list_of_lists)
os.unlink(f)
输出列表列表,例如:
[[['1','1','1'],['12'],['abcd.1234.0000'],['1','1','12'],['CGNLTEST123V',' CGNLTEST123V,CGNLTEST123V,CGNLTEST123V,CGNLTEST123V,CGNLTEST123V,CGNLTEST123V,CGNLTEST123V,CGNLTEST123V,CGNLTEST123V,CGNLTEST123V,CGNLTEST123V :: / 127']]]
然后,您可以将每个变量的输入参数列表去重复,以获取原始值。
关于python - 是否可以使用Jinja2模板对文档中的参数进行反向工程?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37813550/