Python Flask 编程 | 连载 06 - Jinja2 语法
持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情
一、Jinja2 模板变量
上下文处理器
上下文处理器 context_processor 可以在模板上下文中添加新的内容,添加的内容可以是变量,也可以是函数。
在 app.py 中新增一个视图函数。
# 其余代码不变
@app.context_processor
def inject_var():
print("inject_var 方法被调用")
data = {"username": "stark"}
return data
在 object.html 页面中使用上面视图函数中定义的变量,在 body 标签中增加如下内容:
<h2>通过上下文处理器添加的变量</h2>
<p>{{ username }}</p>
保存代码,浏览器访问 /object。
需要注意的是:
context_processor
作为一个装饰器修饰一个函数。- 函数的返回结果必须是
dict
,届时dict
中的key
将作为变量在所有模板中可见。
模板变量的使用
模板引擎渲染页面大概有以下几个步骤:
- 从磁盘中读取 HTML 字符串
- 将满足特定规则的内容进行替换
- 发送给浏览器进行展示
在替换内容时字典,元组,列表数据结构在模板中也可以使用 {{ var }}
来获取变量的值。
字符串、整数和浮点数数据类型的渲染
在 app.py 中新建一个视图函数 render_smiple_data。
@app.route('/render_simple_data')
def render_simple_data():
name = 'Thor'
age = 1500
score = 90.00
return render_template('data.html', name=name, age=age, score=score)
在 templates 文件夹中创建 data.html 页面。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<title>Render Data</title>
</head>
<body>
<h1>Render Data</h1>
<h3> name: {{ name }}</h3>
<h3> age: {{ age }}</h3>
<h3> score: {{ score }}</h3>
</body>
</html>
保存代码,浏览器访问 /render_simple_data
字符串、整数和浮点数等基本数据类型都被渲染出来。
字典数据类型的渲染
而对于字典类型的数据,则可以使用 {{ dict.key }}
或者 {{ dict['key']}}
来渲染指定 Key 对应的 Value
新增视图函数 render_complex_data,将字典类型的数据传给前端。
@app.route('/render_complex_data')
def render_complex_data():
info = {
'name': 'stark',
'age': 40,
'gender': 'M',
'address': 'NYC'
}
return render_template('data.html', heros=heros, info=info)
在 data.html 中增加对字典的展示,在 body 标签中增加如下内容:
<h2>Render Dict</h2>
<h3>info字典:{{ info }}</h3>
<h3>info字典中的name属性值为:{{ info.name }}</h3>
<h3>info字典中的address属性值为:{{ info['address'] }}</h3>
保存代码,浏览器访问 /render_complex_data。
列表和元组数据类型的渲染
针对 list 和 tuple 类型的数据索引来获取指定位置的元素。
在视图函数 render_complex_data 中增加一个存储列表类型的变量,并返回给前端。
# 其余代码保持不变
@app.route('/render_complex_data')
def render_complex_data():
heros = ['stark', 'thor', 'clint', 'banner']
return render_template('data.html', heros=heros, info=info)
在 data.html 的 body 标签中增加如下代码:
<h2>Render List</h2>
<h3>heros列表的内容为:{{ heros }}</h3>
<h3>heros列表中的索引为1的值是:{{ heros[1] }}</h3>
<h3>heros列表中的最后一个值是:{{ heros[-1] }}</h3>
保存代码,浏览器访问 /render_complex_data
嵌套数据类型的渲染
针对嵌套类型的数据,如列表嵌套字典的渲染,根据获取的元素的类型一层一层的获取目标数据。
新增视图函数 render_nest_data,该函数中返回给前端一个列表嵌套字典的数据。
@app.route('/render_nest_data')
def render_nest_data():
heros_info = [
{'name': 'stark', 'address': 'New York'},
{'name': 'thor', 'address': 'Asgard'},
{'name': 'strange', 'address': 'New York'},
{'name': 'peter', 'address': 'New York Queens'},
]
return render_template('data.html', heros_info=heros_info)
将 data.html 中 body 标签的内容替换为如下内容:
<h1>Render Data</h1>
<h2>Render Nest Data</h2>
<h3>heros_info 列表的内容为:{{ heros_info }}</h3>
<h3>heros_info 列表中的索引为1的字典的 name 属性值:{{ heros_info[1]['name'] }}</h3>
<h3>heros_info 列表中的最后一个字典的 address 属性值:{{ heros_info[-1]['address'] }}</h3>
保存代码,浏览器访问 /render_nest_data。
二、Jinja2 模板语法
模板标签
模板标签可以理解为模板中的一些关键字,比如在模板中实现循环、赋值或者条件判断等,模板标签由大括号和%组成,有的标签会带有结束标签,有的则没有。
{% TAG %}
{% TAG1 %}
{% endTAG1 %}
条件判断表达式
{% if A %}
{# 满足A条件 #}
{% elif B %}
{# 满足B条件 #}
{% else %}
{# 满足其他条件 #}
{% endif %}
{% if value is xxx %}
{# 符合条件要展示的内容或者执行的代码 #}
{% endif %}
模板中使用 {# #}
来包裹作为注释的内容
模板中包含了一些内置的判断条件,如:
- defined/undefined,变量是否已定义
- none,变量是否为none
- number/string/even/odd, 是否是数字、字符串、奇数或者偶数
- upper/lower,是否大小写
模板中可以使用如 and、or、==、!=、>、<、in、not in
等逻辑判断符进行条件判断
在 app.py 中新增视图函数 tag。
@app.route('/tag')
def tag():
name='stark'
return render_template('tag.html', name=name)
在 templates 目录下新增 tag.html。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<title>Tag</title>
</head>
<body>
<h2> == 逻辑判断符的使用</h2>
{% if name == 'stark' %}
<p>I am Iron Man</p>
{% else %}
<p> I am not Iron Man</p>
{% endif %}
</body>
</html>
浏览器访问 /tag。
在 tag.html 的 body 标签中增加代码。
<h2> defined 判断条件的使用</h2>
{% if age is defined %}
<p>age变量已经被定义</p>
{% else %}
<p>age变量没有被定义</p>
{% endif %}
浏览器再次访问 /tag
视图函数中是没有定义 age 变量的,所以页面中输出 age 没有被定义。
相关文章
- Python 编程 | 连载 18 - 异常处理
- pycharm导出html_python怎么保存代码
- python编程前景_Python前景如何,学完后可以从事方向?
- python爬虫全解
- 用python 打印九九乘法表的7种方式 (python经典编程案例)[通俗易懂]
- python监控网页内容变化_使用Python监控文件内容变化代码实例
- python socket recvfrom_Python:socket.recvfrom()不返回任何地址
- 【说站】python套接字编程的服务器和客户端
- python udp编程_Python核心编程
- 【写在前篇】How to study Python——新手必看
- Python:利用python代码编程实现将视频的avi格式转换为MP4格式
- 让你彻底弄懂Python编程经典案例【考题】之反转一个值
- 4 年时间让 Python 性能提升 5 倍
- 【Python】这篇罕见的符号编程论文,让你在Jupyter Notebook中手绘草图并变成代码
- Python 进阶指南(编程轻松进阶):四、起个好名字
- python-异步IO编程
- python-高级协程编程-asyncio的高级用法(一)
- Python 的socke编程示例详解编程语言
- Python类的访问权限(public、 private、protected)
- Linux 启动 Python编程之旅(linux打开python)
- Linux下快速搭建Python开发环境(linuxpython环境搭建)
- 在Linux上学习Python——你的编程之路(linux学python)
- 使用 Redis 和 Python 构建一个共享单车的应用程序
- Python编程连接MySQL:从零开始(python与mysql)
- python多线程编程方式分析示例详解
- python网络编程学习笔记(七):HTML和XHTML解析(HTMLParser、BeautifulSoup)