jinja2模板语言的运用

jinja2模板语言的运用

  • 简介
  • 模板语法:
    • 注释 {# ... #}
    • 模板传参
    • 表达语句{{ ... }}
    • 控制语句{% ... %}
    • 过滤器
    • 自定义过滤器
    • 宏macro
    • 模板继承block和extends
    • 模板导入 include
    • 消息队列

简介

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 循环内置常量

  • loop.index 当前迭代的索引(从1开始)
  • loop.index0 当前迭代的索引(从0开始)
  • loop.first 是否是第一次迭代,返回True/False
  • loop.last 是否是最后一次迭代,返回True/False
  • loop.length 序列的长度

例子:

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)

宏macro

模板中宏就像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>

模板继承block和extends

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 %}

模板导入 include

在一个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 %}

你可能感兴趣的:(Flask)