当前位置: 首页 > 工具软件 > jill.py > 使用案例 >

Python Jinja2使用方法

黎玺
2023-12-01

一、 作为一个模板语言,它的主要优势是可以省去很多重复的前端代码,用类似于后台循环代码等方式来产生html,首先,需要读入一个带有模板语言的html 模板,类似于如下:

<html>
    <head>
        <meta charset="UTF-8">
    </head>
    <body>
            <p style='font-size:15px; font-family:Arial;'>{{ content }}</p>
            <table border="1" cellspacing="0" cellpadding="0">
            <tr>
                {% if array_table_head %}
                {% for var_i in array_table_head %}
                    <th style="font-size: 15px; padding: 3px;">{{var_i}}</th>
                {% endfor %}
                {% endif %}
            </tr>
            {% if dict_table_data %}
            {% for table_data in dict_table_data %}
            <tr>
                <th style="font-size: 12px; padding: 3px;">{{ table_data.Name }}</th>
                <th style="font-size: 12px; padding: 3px;">{{ table_data.Type }}</th>
                <th style="font-size: 12px; padding: 3px;">{{ table_data.Value }}</th>
            </tr>
            {% endfor %}
            {% endif %}
            </table>
    </body>
</html>

其中, 以{% %}包裹的为模板语句,语法和python神似,只有些许不同,详见Jinja2官方文档(过滤器等),以{{ }} 包裹的为变量引用,会被Jinja2解析为一个变量,即动态变化的数据。

二、加载模板

有了上述的html模板,后台利用如下代码读入。

    import jinja2
    env = jinja2.Environment(loader=jinja2.FileSystemLoader(path))
    temp = env.get_template('statics/template.html')

注意一点: 其中path需要为当前python文件所在目录的完整路径,get_template内部的参数为html模板相对于该python文件所在目录的路径(相对路径)。

三、模拟数据,对模板进行Render

通过第一部分的html模板中我们不难发现该模板一共需要三个变量,content、 array_table_head 以及 dict_table_data。所以我们需要在后台对这三个变量进行模拟。

1. 类型分析。需要注意的是,变量的类型一定要把控好,从模板的观察可以看出content是直接用{{ }}包裹来引用的,所以在后台应该是一种可以直接取值的类型,例如str, int等。而array_table_head是通过遍历来引用的,说明最外层在后台是一个List或tuple等可遍历对象,其次在内层是直接取值的,所以后台应该是一个简单的str或者int的列表。同理,对于dict_table_data, 则是一个字典字符串,所以三个变量的模拟应该如下:

    render_dict = {}
    dict_table_data = [{'Name': 'Basketball', 'Type': 'Sports', 'Value': 5},
                       {'Name': 'Football', 'Type': 'Sports', 'Value': 4.5},
                       {'Name': 'Pencil', 'Type': 'Learning', 'Value': 5},
                       {'Name': 'Hat', 'Type': 'Wearing', 'Value': 2}]
    render_dict.update({'Content': 'Hello reader, here is a table:',
                        'array_table_head': ['Name', 'Type', 'Value'],
                        'dict_table_data': dict_table_data})

2. 模板渲染

最后一步,即通过render方法将变量放入模板中,然后生成新的html写入文件,此时,模板语言将会全部被转化为html。

temp_out = temp.render(content=render_dict['Content'], 
                       array_table_head=render_dict['array_table_head'],
                       dict_table_data=render_dict['dict_table_data'])
with open(os.path.join(path, 'statics/out.html'), 'w', encoding='utf-8') as f:
    f.writelines(temp_out)
    f.close()

四、总结

Jinja2 对于html数据渲染有奇效,同时还具有许多优点:

(1)安全: 强大的 HTML 自动转义系统保护系统免受 XSS攻击。

(2)编译快速: 及时编译最优的 python 代码。

(3)易于调试。异常的行数直接指向模板中的对应行。

(4)具有模板继承的特性,减少大量的工作量。

 类似资料: