Flask-8:jinja模板入门


Flask-8:jinja模板入门

一、前言

  • 之前的文章有个栗子,视图函数可以直接返回一段HTML代码,浏览器可以自动渲染;
  • 但是当你的HTML非常复杂的话,也要整串写在代码里面,这显然不合理,可阅读性也非常差;
  • 所以,就诞生了Jinja2这种模板引擎来解决需要返回的复杂Jinja2模板代码问题。

二、一个简单栗子

下面是Jinja2的模板,他对登录和未登录用户显示不同的信息

<html>
	{% if login %}
	<p>您好,{{name}}</p>
	{% else %}
	<a href='/login'>登录</a>
	{% endif %}
</html>

如果用户已经登录:变量login为真、变量name为Tom,模板被渲染成如下的HTML文件:

<html>
    <p>
        您好,Tom
    </p>
</html>

如果用户没有登录:变量login为假,模板被渲染成如下HTML文件:

<html>
    <a href='/login'>登录</a>
</html>

三、Flask中使用模板

1、目录结构

一般来说templates就是存放模板的目录

2、jinja2模板代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h2>My name is {{ name }}, I'm {{ age }} years old.</h2>
</body>
</html>

3、flask代码

  • 首先,需要import render_template;
  • 然后,视图调用render_template,对模板 templates/index.html进行渲染;
  • 最后,render_template包含有2个命名参数:name和age,模板引擎将模板templates/index.html中的变量进行替换。
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
    return render_template('index.html', name='tom', age=10)
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8080, debug=True)

请求结果

四、分界符

jinja2模板文件混合html语法与jinja2语法,使用分界符区分HTML语法与jinja2语法。有5中常见的分界符:

  • {{ 变量 }},将变量放置在 {{ 和 }} 之间;
  • {% 语句 %},将语句放置在 {% 和 %} 之间;
  • ,将注释放置在 之间;
  • ## 注释, 将注释放置在 # 之后。

1、变量

jinja2 模板中,使用 包围的标识符称为变量,模板渲染会将其替换为Python中的变量。

{{ 变量 }}

2、jinja2模板

<html>
	{{ string }}
	<ul>
		<li> {{ list[0] }}
		<li> {{ list[1] }}
		<li> {{ list[2] }}
		<li> {{ list[3] }}
	</ul>
	<ul>
		<li> {{ dict['name'] }}
		<li> {{ dict['age'] }}
	</ul>
</html>

包含有3种类型的变量:字符串、列表、字典,他们会被替换为同名的Python变量。

3、Flask代码

STRING = 'www.baidu.com'
LIST = ['www', 123, (1, 2, 3), {"name": "Tom"}]
DICT = {'name': 'TOM', 'age': True}
@app.route('/2')
def index2():
    return render_template('01-jinja2_2.html', string=STRING, list=LIST, dict=DICT)

列表的值包含字符串、数字、元组、字典,字典的值包含字符串、布尔值

请求结果

五、for语句

1、语法

jinja2模板中,使用 {% 语句 %} 包围的语法块称为语句,jinja2支持类似于Python的for循环语句:

{% for item in iterable %}
{% endfor %}

2、模板代码

<h1>Members</h1>
<ul>
	{% for user in users %}
    <li>{{ user }}</li>
    {% endfor %}
    # for item in iterable
    <li>{{ user }}</li>
    # endfor
</ul>

3、Flask代码

users = ['tom', 'jerry', 'mike']
@app.route('/3')
def index3():
    return render_template('jinja2_3.html', users=users, iterable=users)

请求结果

六、if语句

1、语法

jinja2模板中,使用 {% 语句 %} 包围的语法块称为语句,jinja2支持类似于Python的if-else判断语句:

{% if cond %}
{% elif cond %}
{% else %}
{% endif %} 

2、模板代码

<html>
{% if a %}
    <p>a is True</p>
{% else %}
    <p>a is False</p>
{% endif %}

{% if b %}
    <p>b is True</p>
{% elif c %}
    <p>b is False, and c is True</p>
{% endif %}
</html>

3、Flask代码

@app.route('/4')
def index4():
    a = False
    b = False
    c = True
    return render_template('01-jinja2_4.html', a=a, b=b, c=c)

请求结果

七、tests

1、语法

jinja2 提供的 tests 可以用来在语句里对变量或表达式进行测试

{% variable is test %}

完整的 test 请参考 https://jinja.palletsprojects.com/en/latest/templates/#builtin-tests,部分test如下:

test 名称 功能
defined 变量是否已经定义
boolean 变量的类型是否是 boolean
integer 变量的类型是否是 integer
float 变量的类型是否是 float
string 变量是否是 string
mapping 变量的类型是否是字典
sequence 变量的类型是否是序列
even 变量是否是偶数
odd 变量是否是奇数
lower 变量是否是小写
upper 变量是否是大写

2、jinja2模板

{% if number is odd %}
    <p> {{ number }} is odd
        {% else %}
    <p> {{ number }} is even
{% endif %}

{% if string is lower %}
    <p> {{ string }} is lower
        {% else %}
    <p> {{ string }} is upper
{% endif %}

3、jinja2模板输入

number = 404
string = 'HELLO'

4、渲染后

<html>
  <p> 404 is even
  <p> HELLO is upper
</html>

八、过滤器

1、语法

jinja2 过滤器的是一个函数

{{ variable | filter }}
  • 执行函数调用 filter(varialbe),把函数返回值作为这个代码块的值;
  • 暂时不举具体的栗子了,只做简单介绍,目测后面我会出详细文章讲解 jinja2;

2、模板

{{ string | upper }}

3、jinja2模板输入

string = 'hello'

4、渲染后

<html>
HELLO
</html>

文章作者: 刘宇亭
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 刘宇亭 !
评论
  目录