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/

10-12 15:52