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

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

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

image.png

需要注意的是:

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

模板变量的使用

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

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

在替换内容时字典,元组,列表数据结构在模板中也可以使用 {{ 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

image.png

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

字典数据类型的渲染

而对于字典类型的数据,则可以使用 {{ 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

image.png

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

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

image.png

嵌套数据类型的渲染

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

新增视图函数 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

image.png

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

image.png

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

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

浏览器再次访问 /tag

image.png

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


相关文章
|
3天前
|
机器学习/深度学习 人工智能 TensorFlow
人工智能浪潮下的自我修养:从Python编程入门到深度学习实践
【10月更文挑战第39天】本文旨在为初学者提供一条清晰的道路,从Python基础语法的掌握到深度学习领域的探索。我们将通过简明扼要的语言和实际代码示例,引导读者逐步构建起对人工智能技术的理解和应用能力。文章不仅涵盖Python编程的基础,还将深入探讨深度学习的核心概念、工具和实战技巧,帮助读者在AI的浪潮中找到自己的位置。
|
3天前
|
机器学习/深度学习 数据挖掘 Python
Python编程入门——从零开始构建你的第一个程序
【10月更文挑战第39天】本文将带你走进Python的世界,通过简单易懂的语言和实际的代码示例,让你快速掌握Python的基础语法。无论你是编程新手还是想学习新语言的老手,这篇文章都能为你提供有价值的信息。我们将从变量、数据类型、控制结构等基本概念入手,逐步过渡到函数、模块等高级特性,最后通过一个综合示例来巩固所学知识。让我们一起开启Python编程之旅吧!
|
3天前
|
存储 Python
Python编程入门:打造你的第一个程序
【10月更文挑战第39天】在数字时代的浪潮中,掌握编程技能如同掌握了一门新时代的语言。本文将引导你步入Python编程的奇妙世界,从零基础出发,一步步构建你的第一个程序。我们将探索编程的基本概念,通过简单示例理解变量、数据类型和控制结构,最终实现一个简单的猜数字游戏。这不仅是一段代码的旅程,更是逻辑思维和问题解决能力的锻炼之旅。准备好了吗?让我们开始吧!
|
5天前
|
设计模式 算法 搜索推荐
Python编程中的设计模式:优雅解决复杂问题的钥匙####
本文将探讨Python编程中几种核心设计模式的应用实例与优势,不涉及具体代码示例,而是聚焦于每种模式背后的设计理念、适用场景及其如何促进代码的可维护性和扩展性。通过理解这些设计模式,开发者可以更加高效地构建软件系统,实现代码复用,提升项目质量。 ####
|
4天前
|
机器学习/深度学习 存储 算法
探索Python编程:从基础到高级应用
【10月更文挑战第38天】本文旨在引导读者从Python的基础知识出发,逐渐深入到高级编程概念。通过简明的语言和实际代码示例,我们将一起探索这门语言的魅力和潜力,理解它如何帮助解决现实问题,并启发我们思考编程在现代社会中的作用和意义。
|
5天前
|
机器学习/深度学习 数据挖掘 开发者
Python编程入门:理解基础语法与编写第一个程序
【10月更文挑战第37天】本文旨在为初学者提供Python编程的初步了解,通过简明的语言和直观的例子,引导读者掌握Python的基础语法,并完成一个简单的程序。我们将从变量、数据类型到控制结构,逐步展开讲解,确保即使是编程新手也能轻松跟上。文章末尾附有完整代码示例,供读者参考和实践。
|
5天前
|
人工智能 数据挖掘 程序员
Python编程入门:从零到英雄
【10月更文挑战第37天】本文将引导你走进Python编程的世界,无论你是初学者还是有一定基础的开发者,都能从中受益。我们将从最基础的语法开始讲解,逐步深入到更复杂的主题,如数据结构、面向对象编程和网络编程等。通过本文的学习,你将能够编写出自己的Python程序,实现各种功能。让我们一起踏上Python编程之旅吧!
|
6天前
|
数据采集 机器学习/深度学习 人工智能
Python编程入门:从基础到实战
【10月更文挑战第36天】本文将带你走进Python的世界,从基础语法出发,逐步深入到实际项目应用。我们将一起探索Python的简洁与强大,通过实例学习如何运用Python解决问题。无论你是编程新手还是希望扩展技能的老手,这篇文章都将为你提供有价值的指导和灵感。让我们一起开启Python编程之旅,用代码书写想法,创造可能。
|
8天前
|
Python
不容错过!Python中图的精妙表示与高效遍历策略,提升你的编程艺术感
本文介绍了Python中图的表示方法及遍历策略。图可通过邻接表或邻接矩阵表示,前者节省空间适合稀疏图,后者便于检查连接但占用更多空间。文章详细展示了邻接表和邻接矩阵的实现,并讲解了深度优先搜索(DFS)和广度优先搜索(BFS)的遍历方法,帮助读者掌握图的基本操作和应用技巧。
25 4
|
10天前
|
存储 人工智能 数据挖掘
从零起步,揭秘Python编程如何带你从新手村迈向高手殿堂
【10月更文挑战第32天】Python,诞生于1991年的高级编程语言,以其简洁明了的语法成为众多程序员的入门首选。从基础的变量类型、控制流到列表、字典等数据结构,再到函数定义与调用及面向对象编程,Python提供了丰富的功能和强大的库支持,适用于Web开发、数据分析、人工智能等多个领域。学习Python不仅是掌握一门语言,更是加入一个充满活力的技术社区,开启探索未知世界的旅程。
20 6