Flask(8)- jinja2 模板入门
前言
- 之前的文章有个栗子,视图函数可以直接返回一段 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 模板入门的更多相关文章
- flask的jinja2模板中过过滤器的相关小内容
jinja2模板中有自带的过滤器,有需要直接拿来使用.也可以自己定义过滤器 在过滤器中,有一些常见得操作及关键字.有对字符串的操作,还有对大小写转换的操作.还有对list的操作 过滤器的语法 {# 过 ...
- flask之jinja2模板语言
一.jinja2简单介绍 Jinja2是Python里一个被广泛应用的模版引擎,他的设计思想来源于Django的模板引擎,并扩展了其语法和一系列强大的功能.其中最显著的一个是增加了沙箱执行功能和可选的 ...
- 【Flask】 Jinja2模板语言
Jinja2 Jinja2是Python Web编程中的主流模板语言.因为flask是基于Jinja2和Werkzeug发展而来,在安装flask的时候jinja2自动就被装在上面了. 之前提到了很多 ...
- Flask的jinja2模板中自定义过滤器的使用
大部分的模板引擎都是支持过滤器功能的,jinja2也不例外,它提供了丰富的内置过滤器,但是有些时候还是没办法满足我们的需求,好在jinja2支持自定义过滤器,下面是一个简单的例子. 下面的例子完成了自 ...
- Flask 学习(二)jinja2模板介绍
控制语句和表达式 举例 Flask Python代码 from flask import Flask, render_template, redirect, request app = Flask(_ ...
- flask中jinjia2模板引擎使用详解1
在之前的文章中我们介绍过flask调用jinja2模板的基本使用,这次我们来说一下jinjia2模板的使用 Jinja2 在其是一个 Python 2.4 库之前,被设计 为是灵活.快速和安全的. 模 ...
- Flask从入门到精通之Jinja2模板引擎
我们使用一个简单的例子切入到Jinja2模板引擎,形式最简单的Jinja2模板引擎就是一个包含响应文本的文件,实例如下: <h1>Hello World!</h1> 最简单的包 ...
- Python框架学习之Flask中的Jinja2模板
前面也提到过在Flask中最核心的两个组件是Werkzeug和Jinja2模板.其中Werkzeug在前一节已经详细说明了.现在这一节主要是来谈谈Jinja2模板. 一.为什么需要引入模板: 在进行软 ...
- Flask中的模板语言jinja2
jinja2介绍 jinja2是Flask作者开发的一个模板系统,起初是仿django模板的一个模板引擎,为Flask提供模板支持,由于其灵活,快速和安全等优点被广泛使用. jinja2的优点 jin ...
随机推荐
- Windows 10 创建虚拟网卡
想把虚拟机桥接到我的电脑,但我连的是无线网电脑没查网线,所以就创建个虚拟网卡吧. 1.win + x 打开设备管理器 2.网络适配器 + 操作 + 添加过时硬件 3.下一步 4.选-->安 ...
- Java中JDK,JRE和JVM之间的关系-(转载)
初学JAVA很容易被其中的很多概念弄的傻傻分不清楚,首先从概念上理解一下吧,JDK(Java Development Kit)简单理解就是Java开发工具包,JRE(Java Runtime Envi ...
- centos 7修改yum源
centos系统要定期更新,前天使用sudo yum update命令更新过程中出错,安装的是x64的系统,结果更新的内容有i686的依赖包,最终由于64与32位系统依赖的原因导致更新失败,更糟糕的是 ...
- 《Matlab实用案例》系列Matlab从入门到精通实用100例案例教程目录(持续更新)
目录 1. 专栏简介 2. 专栏地址 3. 专栏目录 1. 专栏简介 2. 专栏地址 「 刘一哥与GIS的故事 」之<Matlab使用案例> 3. 专栏目录 [MATLAB统计分析与应用1 ...
- 标准Gitlab命令行操作指导
gitlab是一个分布式的版本仓库,总比只是一个本地手动好些,上传你的本地代码后后还能web GUI操作,何乐不为? 贴上刚刚搭建的gitlab,看看git 如何操作标准命令行操作指导 1.命令行操作 ...
- Day029 JDK8中新日期和时间API (四)
JDK8中新日期和时间API 其他的一些API ZoneId:该类中包含了所有的时区信息,一个时区的ID,如 Europe/Paris ZonedDateTime:一个在ISO-8601日历系统时区的 ...
- Step By Step(Lua-C API简介)
Step By Step(Lua-C API简介) Lua是一种嵌入式脚本语言,即Lua不是可以单独运行的程序,在实际应用中,主要存在两种应用形式.第一种形式是,C/C++作为主程序,调用Lua代码, ...
- Docker学习(6) 获取和推送镜像
查找镜像 拉取镜像 推送镜像 总结
- 08.ElementUI 2.X 源码学习:源码剖析之工程化(三)
0x.00 前言 项目工程化系列文章链接如下,推荐按照顺序阅读文章 . 1️⃣ 源码剖析之工程化(一):项目概览.package.json.npm script 2️⃣ 源码剖析之工程化(二):项目构 ...
- 微信架构 & 支付架构(上)
微信架构 & 支付架构(上) 一. 微信和支付宝对比 这两者现在已经占领了移动支付的90%市场,支付形式也都大抵相同,只是在实现细节上略微不同.这里之所以要专门对比,是因为有些接口的不同在后边 ...