Python Flask 编程 | 连载 06 - Jinja2 语法

本文介绍了Jinja2模板语言中如何通过上下文处理器添加变量,以及如何处理字符串、整数、浮点数、字典、列表和元组等数据类型的渲染,包括条件判断和模板语法的使用。同时提供了一个完整的Python应用示例和学习资源链接。
摘要由CSDN通过智能技术生成

一、Jinja2 模板变量

上下文处理器

上下文处理器 context_processor 可以在模板上下文中添加新的内容,添加的内容可以是变量,也可以是函数。

在 app.py 中新增一个视图函数。

python
复制代码
# 其余代码不变

@app.context_processor
def inject_var():
    print("inject_var 方法被调用")
    data = {"username": "stark"}
    return data

在 object.html 页面中使用上面视图函数中定义的变量,在 body 标签中增加如下内容:

html
复制代码
<h2>通过上下文处理器添加的变量</h2>
<p>{{ username }}</p>

保存代码,浏览器访问 /object

image.png

需要注意的是:

  • context_processor 作为一个装饰器修饰一个函数。
  • 函数的返回结果必须是 dict,届时 dict 中的 key 将作为变量在所有模板中可见。

模板变量的使用

模板引擎渲染页面大概有以下几个步骤:

  1. 从磁盘中读取 HTML 字符串
  2. 将满足特定规则的内容进行替换
  3. 发送给浏览器进行展示

在替换内容时字典,元组,列表数据结构在模板中也可以使用 {{ var }} 来获取变量的值。

字符串、整数和浮点数数据类型的渲染

在 app.py 中新建一个视图函数 render_smiple_data。

python
复制代码
@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 页面。

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

image.png

字符串、整数和浮点数等基本数据类型都被渲染出来。

字典数据类型的渲染

而对于字典类型的数据,则可以使用 {{ dict.key }} 或者 {{ dict['key']}} 来渲染指定 Key 对应的 Value

新增视图函数 render_complex_data,将字典类型的数据传给前端。

python
复制代码
@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 标签中增加如下内容:

html
复制代码
<h2>Render Dict</h2>
<h3>info字典:{{ info }}</h3>
<h3>info字典中的name属性值为:{{ info.name }}</h3>
<h3>info字典中的address属性值为:{{ info['address'] }}</h3>

保存代码,浏览器访问 /render_complex_data

image.png

列表和元组数据类型的渲染

针对 list 和 tuple 类型的数据索引来获取指定位置的元素。

在视图函数 render_complex_data 中增加一个存储列表类型的变量,并返回给前端。

python
复制代码
# 其余代码保持不变

@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 标签中增加如下代码:

html
复制代码
<h2>Render List</h2>
<h3>heros列表的内容为:{{ heros }}</h3>
<h3>heros列表中的索引为1的值是:{{ heros[1] }}</h3>
<h3>heros列表中的最后一个值是:{{ heros[-1] }}</h3>

保存代码,浏览器访问 /render_complex_data

image.png

嵌套数据类型的渲染

针对嵌套类型的数据,如列表嵌套字典的渲染,根据获取的元素的类型一层一层的获取目标数据。

新增视图函数 render_nest_data,该函数中返回给前端一个列表嵌套字典的数据。

python
复制代码
@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 标签的内容替换为如下内容:

html
复制代码
<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

image.png

二、Jinja2 模板语法

模板标签

模板标签可以理解为模板中的一些关键字,比如在模板中实现循环、赋值或者条件判断等,模板标签由大括号和%组成,有的标签会带有结束标签,有的则没有。

html
复制代码
{% TAG %}

{% TAG1 %}
{% endTAG1 %}

条件判断表达式

html
复制代码
{% 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。

python
复制代码
@app.route('/tag')
def tag():
    name='stark'
    return render_template('tag.html', name=name)

在 templates 目录下新增 tag.html。

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

image.png

在 tag.html 的 body 标签中增加代码。

html
复制代码
<h2> defined 判断条件的使用</h2>
{% if age is defined %}
    <p>age变量已经被定义</p>
{% else %}
    <p>age变量没有被定义</p>
{% endif %}

浏览器再次访问 /tag

image.png

视图函数中是没有定义 age 变量的,所以页面中输出 age 没有被定义。

这里给大家分享一份Python全套学习资料,包括学习路线、软件、源码、视频、面试题等等,都是我自己学习时整理的,希望可以对正在学习或者想要学习Python的朋友有帮助!

CSDN大礼包:全网最全《全套Python学习资料》免费分享🎁

😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓

👉CSDN大礼包🎁:全网最全《Python学习资料》免费分享(安全链接,放心点击)👈

1️⃣零基础入门

① 学习路线

对于从来没有接触过Python的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

② 路线对应学习视频

还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~在这里插入图片描述

③练习题

每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
在这里插入图片描述
因篇幅有限,仅展示部分资料

2️⃣国内外Python书籍、文档

① 文档和书籍资料

在这里插入图片描述

3️⃣Python工具包+项目源码合集

①Python工具包

学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!
在这里插入图片描述

②Python实战案例

光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!
在这里插入图片描述

③Python小游戏源码

如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!
在这里插入图片描述

4️⃣Python面试题

我们学会了Python之后,有了技能就可以出去找工作啦!下面这些面试题是都来自阿里、腾讯、字节等一线互联网大厂,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述

5️⃣Python兼职渠道

而且学会Python以后,还可以在各大兼职平台接单赚钱,各种兼职渠道+兼职注意事项+如何和客户沟通,我都整理成文档了。
在这里插入图片描述
在这里插入图片描述
上述所有资料 ⚡️ ,朋友们如果有需要 📦《全套Python学习资料》的,可以扫描下方二维码免费领取 🆓
😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓

👉CSDN大礼包🎁:全网最全《Python学习资料》免费分享(安全链接,放心点击)👈

  • 34
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值