Python的Jinja2模板,其实就是在HTML文档中使用控制语句和表达语句替换HTML文档中的变量来控制HTML的显示格式,Python的Jinja2模板可以更加灵活和方便的控制HTML的显示,而且大大地减少了编程人员的工作量。
jinja2的web模板中可以使用这个注释一行或者多行HTML中的内容。
Fkask中的页面渲染是通过jinjia2模块实现的,依赖于render_template函数。
当传参数个数少的时候可以直接添加关键字参数,如下:
@app.route('/myhtml', methods=['GET', 'POST'])
def myhtml():
str1 = 'python'
list1 = [1, 2, 3]
return render_template('abcde.html', str1=str1, list1=list1)
当有多个参数的时候,可以先把所有的参数放到字典中,然后在render_template通过解包的方式把字典里的内容传递进去。
@app.route('/login', methods=['GET', 'POST'])
def login():
str1 = 'flask'
list1 = [1, 2, 3]
dict2 = {'name': 'xiaowang', 'age': 18}
data = {
'str1': str1,
'list1': list1,
'dict2': dict2,
}
return render_template('temp1.html', **data)
Jinja2模板语法可以自动运行{{ … }}中的语句并把运行结果显示在HTML模板中。比如获取变量的值可以使用{{变量}}
来获取。
控制语句需要使用一个结束标志表明该语句的结束,通常用来作循环控制、条件控制、模块控制等,可以更加方便的控制HTML内容的显示;比较常用的有if语句和for语句。
if 语句:
{% if 条件A %}
语句一
{% elif 条件B %}
语句二
...
{% else %}
语法三
{% endif %}
for 语句:
{% for 变量 in 容器 %}
...
{% else %} # 当for遍历的序列中没有值时就会执行else中的内容
...
{% endfor %}
for 循环内置常量
例子:
html内容:
<h3>模板语言里的if 语句h3>
{% if newlist %}
{{ newlist }}
{% else %}
{{ list1 }}
{% endif %}
<br>
<h3>模板语言里的字典的值的获取h3>
{% for i in dict2.values() %}
{{ i }}
{% endfor %}
形式为{{ var | filter }}
管道符“|”前面是变量,后面是一个过滤器(过滤器相当于一个函数)。
链式调用过滤器: {{ var | filter1 | filter2 }}
一些常用的过滤器:
过滤器名 | 作用 |
---|---|
sum | 可以指定值相加 |
abs | 返回一个数值的绝对值 |
default(value,default_value,boolean=false) | 如果当前变量没有值,则会使用参数中的值来代替。 |
escape或e | 转义字符,会将<、>等符号转义成HTML中的符号。显例:content |
first | 返回一个序列的第一个元素。 |
last | 返回一个序列的最后一个元素。 |
length | 返回一个序列或者字典的长度。 |
safe | 如果开启了全局转义,那么safe过滤器会将变量关掉转义 |
lower | 将字符串转换为小写。 |
upper | 将字符串转换为小写。 |
replace(value,old,new) | 替换将old替换为new的字符串。 |
striptags(value) | 删除字符串中所有的HTML标签,如果出现多个空格,将替换成一个空格。 |
trim | 截取字符串前面和后面的空白字符。 |
string(value) | 将变量转换成字符串。 |
1.用装饰器来注册成过滤器,参数是过滤器名
# 自定义的过滤器(第一种)
@app.template_filter('listreserve')
def list_reverse(ls):
ls.reverse()
return ls
2.先定义函数,再将函数添加到过滤器app.add_template_filter(函数名字,‘过滤器名字’)
,如果没有设置过滤器名字,那过滤器名字就是函数名字。
def new_reverse(ls):
ls.reverse()
return ls
# 自定义的过滤器(第二种)
app.add_template_filter(new_reverse)
模板中宏就像Python中的函数一样,当多个地方需要使用相似代码片段时,通过定义宏,然后根据不同需求给宏传递参数即可达到目的,不用重新写一遍代码。
定义一个宏 ,例子:
{% macro func1(label='', type='text', username='') %}
<label>{{ label }}label><input type="{{ type }}" name="{{ username }}">
{% endmacro %}
在其他地方调用这个宏:
{% import 'my_macro.html' as mymacro %}
<form>
{{ mymacro.func1('账号','text','username') }}
{{ mymacro.func1('输入密码','password','password') }}
form>
1.在父模板板中使用{% block block_name %}{% endblock %}进行模块的占位
2.子模版中使用{% extends “xxx.html” %}表示此HTML模板继承自“xxx.html”模板(父模板)
3.子模版使用{% block block_name %}{% endblock %} 来重写父模板的这块内容
4.子模版中可以在block中使用{{ super() }}
来调用父模板这块的内容
例子:
父模板:
{% block top %}
<div>这是头部分div>
{% endblock %}
{% block context %}
<div>这是中间部分div>
{% endblock %}
{% block footer %}
<div>这是腿部分div>
{% endblock %}
子模板:
{% extends 'base.html' %}
{% block context %}
{# {{ super() }} #} {# 这里是调用原始页面的部分 #}
<div>这是儿子里面的内容div>
{% endblock %}
在一个HTML模板中使用{% include “xxx.html” %},就会将xxx.html的内容导入(嵌入)当前HTML模板中,效果相当于将xxx.html的内容copy到执行include语句时的位置,并且可以在xxx.html中直接使用当前模板中的参数变量。
例子:
{% include 'xxx.html' ignore missing %} {# 在此处把 xxx.html 里的全部代码全都加载进来 #}
说明: 如果有xxx.html这个文件,就加载。如果没有这个文件,{% include ‘xxx.html’ ignore missing %}这条语句就不执行。
后端代码:
# 下面是消息队列的配置
import os
app.secret_key = os.urandom(24)
@app.route('/info')
def info():
# 消息队列的学习
flash('快吃饭了')
return '消息就加入成功了'
@app.route('/getinfo')
def getinfo():
return render_template('temp4.html')
html 代码:
{% for message in get_flashed_messages() %}
{{ message }}
{% endfor %}