jinja2是一种模板语言,可以利用模版进行数据渲染的底层调用,避免编写重复的代码。
jinja2语法
1.控制结构 {% %} 使用'-'可以去掉换行, 控制结构需以 endXX 结尾
2.变量取值 {{ }}
3.注释 {# #}
Jinja2中for循环内置常量
内置常量 | 描述 |
---|---|
loop.index | 当前迭代的索引(从1开始) |
loop.index0 | 当前迭代的索引(从0开始) |
loop.first | 是否是第一次迭代,返回True / False |
loop.last | 是否是最后一次迭代,返回True / False |
loop.length | 序列的长度 |
过滤器
可以通过“过滤器”对变量进行修改,可以理解为是jinja2里面的内置函数和字符串处理函数。
常用的过滤器有:
safe: 渲染时值不转义
capitialize: 把值的首字母转换成大写,其他子母转换为小写
lower: 把值转换成小写形式
upper: 把值转换成大写形式
title: 把值中每个单词的首字母都转换成大写
trim: 把值的首尾空格去掉
join: 拼接多个值为字符串
replace: 替换字符串的值
round: 默认对数字进行四舍五入,也可以用参数进行控制
int: 把值转换成整型
用法:通过管道(|)分割,多个过滤器可以链式调用,前一个过滤器的输出会作为后一个过滤器的输入。如:{{ icon | lower }}
宏
可以将一些经常用到的代码片段放到宏中,然后把一些不固定的值抽取出来当成一个变量,在使用宏时传递参数,从而将宏渲染成为页面的一部分。
声明定义一个宏:
{% macro input(name, value='', type='text') %}
<input type="{{ type }}" name="{{ name }}" value="{{ value }}">
{% endmacro %}
调用这个宏:
<p>{{ input('username') }}</p>
<p>{{ input('password', type='password') }}</p>
函数
temp = Template(open的模版文件) # 载入模版
ret = temp.render(传入参数) # 渲染模版
文件结构
project
│ html.py
│
└───rely
│ background.webp
│ html.template
│ icon.ico
html.py
from jinja2 import Template
http_template = open('Rely/html.template', encoding='utf8').read() # 打开模版
temp = Template(http_template) # 载入模版
# 设置参数
element = {'icon': "RELY/ICON.ICO",
'background': "rely/background.webp",
'links': ['https://www.baidu.com', 'https://image.baidu.com']}
ret = temp.render(element) # 渲染模版
open(f'BaiDu.html', 'w', encoding='utf8').write(ret)
html.template
这里以生成html文件为例,所以会涉及到一些关于html的语法结构,所以简单提一下,不需要了解的可以直接看代码。
为方便理解,可以简单理解成:
html文件由html标签构成,标签以<XXX>开头,以</XXX>结束
开头标签<XXX>内可以传入各种参数修改属性
<html>
<head>
<link href="{{ icon | lower }}" rel="shortcut icon">
<title> 百度 </title>
<style> {# 设置参数 #}
body
{
background-image:url("{{ background }}"); {# background- 设置背景的参数 #}
background-repeat:no-repeat;
background-attachment:fixed;
background-position:center;
}
</style>
</head>
<body>
{%- for url in links%}
<p> {# 标签 p 为创建一个段落 #}
<a href="{{ url }}"> 百度链接 </a></p>
{%- endfor %}
</body>
执行结果
运行html.py后会在同级目录下生成一个BaiDu.html文件
- BaiDu.html以记事本形式打开:
<html>
<head>
<link href="rely/icon.ico" rel="shortcut icon">
<title> 百度 </title>
<style>
body
{
background-image:url("rely/background.webp");
background-repeat:no-repeat;
background-attachment:fixed;
background-position:center;
}
</style>
</head>
<body>
<p>
<a href="https://www.baidu.com"> 百度链接 </a></p>
<p>
<a href="https://image.baidu.com"> 百度链接 </a></p>
</body>
- BaiDu.html以网页形式打开: