前言

  • 之前的文章有个栗子,视图函数可以直接返回一段 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 中使用模板

目录结构

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

jinja2 模板代码

<!DOCTYPE html>
<html>
<body>
<h2>My name is {{ name }}, I am {{ age }} years old</h2>
</body>
</html>

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) app.run(debug=True)

浏览器的运行效果

分界符

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

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

变量

语法

jinja2 模板中,使用  {{ var }}  包围的标识符称为变量,模板渲染会将其替换为 Python 中的变量,语法如下:

 {{ 变量 }}

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 变量

flask 代码

from flask import Flask, render_template

app = Flask(__name__)

string = 'www.imooc.com'
list = ['www', 123, (1, 2, 3), {"name": "poloyy"}]
dict = {'name': 'zhangsan', 'age': True} @app.route('/2')
def index2():
return render_template('index2.html', string=string, list=list, dict=dict) app.run(debug=True)

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

浏览器的运行效果

for 语句

语法

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

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

有些教程会说有另一种等价写法

# for item in iterable
# endfor 

但我实验发现并不生效

jinja2 模板代码

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

Flask 代码

#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
# author: 小菠萝测试笔记
# blog: https://www.cnblogs.com/poloyy/
# time: 2021/7/11 6:04 下午
# file: 6_jinja2.py
"""
from flask import Flask, render_template app = Flask(__name__) users = ['tom', 'jerry', 'mike'] @app.route('/3')
def index3():
return render_template('index3.html', users=users, iterable=users) app.run(debug=True)

浏览器的运行效果

能看到 # for 的写法并没有生效

if 语句

语法

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

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

jinja2 模板代码

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

Flask 代码

#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
# author: 小菠萝测试笔记
# blog: https://www.cnblogs.com/poloyy/
# time: 2021/7/11 6:04 下午
# file: 6_jinja2.py
"""
from flask import Flask, render_template app = Flask(__name__) @app.route('/4')
def index4():
a = False
b = False
c = True
return render_template('index4.html', a=a, b=b, c=c) app.run(debug=True) 

浏览器的运行效果

tests

语法

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

变量是否是大写

jinja2 模板代码

<html>
{% 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 %}
</html>

jinja2 的模板输入

number = 404
string = 'HELLO'

渲染后的 html

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

过滤器

语法

jinja2 过滤器的是一个函数,语法如下:

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

jinja2 模板

<html>
{{ string | upper }}
</html>

jinja2 的模板输入

string = 'hello'

渲染后的 html

<html>
HELLO
</html>

Flask(8)- jinja2 模板入门的更多相关文章

  1. flask的jinja2模板中过过滤器的相关小内容

    jinja2模板中有自带的过滤器,有需要直接拿来使用.也可以自己定义过滤器 在过滤器中,有一些常见得操作及关键字.有对字符串的操作,还有对大小写转换的操作.还有对list的操作 过滤器的语法 {# 过 ...

  2. flask之jinja2模板语言

    一.jinja2简单介绍 Jinja2是Python里一个被广泛应用的模版引擎,他的设计思想来源于Django的模板引擎,并扩展了其语法和一系列强大的功能.其中最显著的一个是增加了沙箱执行功能和可选的 ...

  3. 【Flask】 Jinja2模板语言

    Jinja2 Jinja2是Python Web编程中的主流模板语言.因为flask是基于Jinja2和Werkzeug发展而来,在安装flask的时候jinja2自动就被装在上面了. 之前提到了很多 ...

  4. Flask的jinja2模板中自定义过滤器的使用

    大部分的模板引擎都是支持过滤器功能的,jinja2也不例外,它提供了丰富的内置过滤器,但是有些时候还是没办法满足我们的需求,好在jinja2支持自定义过滤器,下面是一个简单的例子. 下面的例子完成了自 ...

  5. Flask 学习(二)jinja2模板介绍

    控制语句和表达式 举例 Flask Python代码 from flask import Flask, render_template, redirect, request app = Flask(_ ...

  6. flask中jinjia2模板引擎使用详解1

    在之前的文章中我们介绍过flask调用jinja2模板的基本使用,这次我们来说一下jinjia2模板的使用 Jinja2 在其是一个 Python 2.4 库之前,被设计 为是灵活.快速和安全的. 模 ...

  7. Flask从入门到精通之Jinja2模板引擎

    我们使用一个简单的例子切入到Jinja2模板引擎,形式最简单的Jinja2模板引擎就是一个包含响应文本的文件,实例如下: <h1>Hello World!</h1> 最简单的包 ...

  8. Python框架学习之Flask中的Jinja2模板

    前面也提到过在Flask中最核心的两个组件是Werkzeug和Jinja2模板.其中Werkzeug在前一节已经详细说明了.现在这一节主要是来谈谈Jinja2模板. 一.为什么需要引入模板: 在进行软 ...

  9. Flask中的模板语言jinja2

    jinja2介绍 jinja2是Flask作者开发的一个模板系统,起初是仿django模板的一个模板引擎,为Flask提供模板支持,由于其灵活,快速和安全等优点被广泛使用. jinja2的优点 jin ...

随机推荐

  1. docker swarm外部验证负载均衡时不生效

    问题描述 我在本地创建了3个装了centos7的虚拟机, 并初始化了swarm集群, 即1个manager节点, 2个worker节点; 三台机子的ip分别是 192.168.124.8 - (man ...

  2. [论文阅读笔记] Are Meta-Paths Necessary, Revisiting Heterogeneous Graph Embeddings

    [论文阅读笔记] Are Meta-Paths Necessary? Revisiting Heterogeneous Graph Embeddings 本文结构 解决问题 主要贡献 算法原理 参考文 ...

  3. 20192113 2020-2021-2 《Python程序设计》实验三报告

    20192113 2020-2021-2 <Python程序设计>实验三报告 课程:<Python程序设计> 班级: 1921 姓名: 衣丽莎 学号:20192113 实验教师 ...

  4. p4 学习笔记

    新版的p4编译器编译p4-14 p4c test.p4 -o meter --std p4-14 #p4-14和p4-16存在较大差异,参考p4代码时需注意 p4语言特性 无符号数bit类型的操作:此 ...

  5. paramiko 详解

    Paramiko是用python语言写的一个模块,远程连接到Linux服务器,查看上面的日志状态,批量配置远程服务器,文件上传,文件下载等 初始化一些参数: host = "120.24.2 ...

  6. 'utf-8' codec can't decode byte 0xd5 in position XXX: invalid continuation byte问题

    找了一下午,各种资料搜集,愣是没搜出来答案. 结果今天早上,做一个小小的改变,就整出来了... 步骤如下: 1.打开excel,全选数据 2.新建记事本,粘贴,选择脚本,更改字体: 3.新建Excel ...

  7. 面试侃集合 | SynchronousQueue非公平模式篇

    面试官:好了,你也休息了十分钟了,咱们接着往下聊聊SynchronousQueue的非公平模式吧. Hydra:好的,有了前面公平模式的基础,非公平模式理解起来就非常简单了.公平模式下,Synchro ...

  8. ITS智能交通监控系统技术解析

    ITS智能交通监控系统技术解析 红灯,逆行,变 车辆抓拍和车速检测 非法停车和交通流量检测 交叉路口违法检测 发生碰撞的交叉口是智能交通管理. 机动执法 当你需要一个可以移动的系统时,会跟着你移动.移 ...

  9. postman实现参数化执行及断言处理

    一.假设需要做的测试的参数如下: 注意保存为.csv文件时一定要选择格式为UTF-8 ,避免乱码. 二.输入参数和期望结果在postman中的用法: 注意一定要通过runner的方式进行运行,选择对应 ...

  10. CArray CList CMap 插入与遍历效率对比

    前言:程序中经常用到不定量数组,选择上可以使用CArray,CList,CMap,而这三者插入及遍历的效率,未测试过,随着数据量越来越大,需要做程序上的优化,于是比较下三种类型的插入盒遍历的效率. 一 ...