Code前端首页关于Code前端联系我们

Jinja2:FLASK的艺术使用Python渲染模板

terry 2年前 (2023-09-24) 阅读数 75 #后端开发
Jinja2:FLASK使用Python进行模板渲染的艺术Flask中的jinja2是什么?

前言

jinja2是Flask作者开发的模板系统。它最初是一个模拟 Django 模板的模板引擎,为 Flask 提供模板支持。 ,以其灵活、快速、安全等优点而被广泛应用。当我们开发Web应用时,通常需要将数据动态渲染成HTML模板,jinja2的Python模板技术就是为此而诞生的。

为了理解jinja2,你必须首先理解模板的概念。模板广泛应用于 Python Web 开发中。它们可以有效地分离业务逻辑和页面逻辑,使代码更具可读性,更易于理解和维护。

模板只是一个包含封装变量的文件,它表示动态部分。模板文件动态分配后返回给用户。 Jinja2:FLASK使用Python进行模板渲染的艺术模板渲染流程

Jinja2简介

Jinja2是一个流行的Python模板引擎,可以帮助我们将数据渲染成HTML、XML、Markdown等各种格式的文档。 Jinja2 具有以下功能:

  • • 语法简单灵活
  • • 支持继承和模板包含
  • • 支持过滤器和控制结构
  • • 可自定义全局变量

安装

Jinja2 可以使用 pip 轻松安装:

pip install Jinja2

基本语法

Jinja2 的基本语法与 Python 非常相似,包括变量、表达式、控制结构等。以下是一些示例:

<!-- 变量 -->
<p>Hello, {{ name }}!</p>

<!-- 表达式 -->
{% if count > 10 %}
  <p>There are too many items.</p>
{% else %}
  <p>There are {{ count }} items.</p>
{% endif %}

<!-- 循环 -->
<ul>
{% for item in items %}
  <li>{{ item }}</li>
{% endfor %}
</ul>

在此示例中,我们使用变量、表达式和结构循环来渲染模板。变量使用语法 {{ ... }},表达式使用语法 {% ... %},循环结构使用 {% for ... in …… %} ... {% endfor %} 语法。

模板继承和包含

模板继承

Jinja2最强大的部分是模板继承。模板继承允许我们创建一个基础文件(骨架/Base),其他模板文件继承该基础文件,然后根据需要修改它们。在

Jinja2 基础文件中,关键字 block 用于指示其包含的内容是可修改的。它可以帮助我们避免重复的代码和布局。

这是一个示例:

<!-- base.html -->
<html>
<head>
  <title>{% block title %}{% endblock %}</title>
</head>
<body>
  {% block content %}
  {% endblock %}
</body>
</html>

<!-- page.html -->
{% extends "base.html" %}

{% block title %}My Page{% endblock %}

{% block content %}
  <h1>Welcome to my page!</h1>
{% endblock %}

在此示例中,我们定义了基本模板base.html,其中包含页面的基本结构和布局。我们还定义了一个子模板page.html,它继承base.html并覆盖其中的标题和内容块。

模板包含

除了模板继承之外,Jinja2还支持模板包含,可以将重复的代码抽象到单独的模板中,然后在其他模板中引用。

这有助于我们避免重复代码和布局。下面是一个示例:

<!-- header.html -->
<header>
  <h1>My Website</h1>
  <nav>
    <ul>
      <li><a href="/">Home</a></li>
      <li><a href="/about">About</a></li>
      <li><a href="/contact">Contact</a></li>
    </ul>
  </nav>
</header>

<!-- page.html -->
{% include "header.html" %}

<main>
  <h1>Welcome to my page!</h1>
  <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
</main>

{% include "footer.html" %}

在此示例中,我们定义标头模板header.html,其中包含网站的标题和导航菜单。然后,我们在页面模板page.html中引用页眉和尾部模板footer.html来创建整个页面。

使用模板包含可以帮助我们更好地组织我们的代码和布局,从而更容易维护和扩展我们的代码。

可以使用过滤器

更改过滤器和控制结构变量

。 Filter可以理解为jinja2中的内置函数字符串处理函数

常用的过滤器有:

过滤器名称描述
安全渲染时值不转义
大写将值的第一个字母转换为大写,第二个下标将父项转换为小写
lower 将值转换为小写
upper 将值转换为大写
标题 将值中每个单词的第一个字母转换为大写
Trim Reove 让 value 中的前导和尾随空格
striptags渲染前删除 value 中的所有 HTML 标签
Join将多个值拼接成字符串交换字符串值
圆 数字默认四舍五入,也可以通过参数控制
int将值转换为整数

除了上述功能之外,Jinja2还有其他一些有用的功能,下面介绍其中一些:

安全过滤器

在模板中呈现用户提供的数据时,安全性是一个非常重要的问题。 Jinja2提供了安全过滤器,可以帮助我们过滤掉一些危险的HTML标签和属性,防止XSS攻击等安全问题。

安全过滤器示例:

{{ user_input|safe }}

循环控制结构

除了基本循环结构外,Jinja2还提供了一些高级循环控制结构,如breakcontinueloop.index0等。这些控制结构可以帮助我们更好的控制循环过程。

在for循环中,jinja2提供了一些特殊的变量来获取当前的转换状态:

变量 描述
loop.index当前迭代的索引(从1开始)
Loop.index0当前迭代的索引(从0开始)
loop.first是否是第一次迭代,返回bool
loop.last是否是最后一次迭代,返回bool
loop.length序列中的元素数量
loop.revindex直到循环结束的次数(从1开始)
loop.revindex0次数直到循环结束(从 0 开始)

循环控制结构示例:

{% for item in items %}
  {% if item == 'stop' %}
    {% break %}
  {% elif item == 'skip' %}
    {% continue %}
  {% endif %}
  <li>{{ loop.index0 }}: {{ item }}</li>
{% endfor %}

自定义全局变量

除了在模板中定义变量外,Jinja2 还支持在 Python 代码中定义全局变量,然后使用它们在模板中。这有助于我们更好地组织代码和数据。

自定义全局变量示例:

from jinja2 import Environment

# 定义全局变量
my_var = 'Hello, world!'

# 创建模板引擎
env = Environment()

# 添加全局变量
env.globals['my_var'] = my_var

# 渲染模板
template = env.from_string('<p>{{ my_var }}</p>')
result = template.render()
print(result)

在此示例中,我们定义全局变量my_var,然后将其添加到模板引擎全局变量中。最后,我们使用模板引擎渲染模板并输出结果。

使用Jinja2渲染

在jinja2模块中有一个名为Environment的类。此类的实例用于存储配置和全局对象,然后从文件系统或其他位置加载模板。

基本用法

大多数应用程序在初始化期间创建环境对象并使用它来加载模板。该环境支持两种加载方式:

  • • PackageLoader:包加载器
  • • FileSystemLoader:文件系统加载器

PackageLoader

参数:

  • • PackageLoader() 的两个参数是:python 包名称和模板目录名称。
  • • get_template():获取模板目录下的指定文件。
  • • render():接受变量并渲染模板

使用包加载器加载文档的最简单方法如下:

from jinja2 import PackageLoader,Environment
# 创建一个包加载器对象
env = Environment(loader=PackageLoader('项目xx包目录','templates'))
# 获取一个模板文件
template = env.get_template('bast.html')    
# 渲染
template.render(name='daxin',age=18)   

FileSystemLoader

不需要模板文件的文件系统加载器存在于某个Python包下,可以直接访问系统中的文件

Summary

Jinja2是一个强大而灵活的Python模板引擎,可以帮助我们将数据渲染成各种格式的文档。它具有简单灵活的语法、支持模板继承和包含、支持过滤器和控制结构等特性。如果你需要在Python中使用模板引擎,Jinja2是一个不错的选择。

当然,除了在Python Web开发过程中使用Jinja2模板之外,您还可以使用它来创建自动化脚本(自动化用例)。您可以根据相关自动化信息(例如用例编号、步骤、断言等)构建批次。创建各种自动化测试用例(脚本)。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门