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

2023-05-2620:11:13后端程序开发Comments869 views字数 4097阅读模式
Jinja2:FLASK使用Python进行模板渲染的艺术
Flask 中 jinja2 是什么

前言

jinja2 是 Flask 作者开发的一个模板系统,起初是仿 Django 模板的一个模板引擎,为 Flask 提供模板支持,由于其灵活,快速和安全等优点被广泛使用。当我们开发 Web 应用程序时,通常需要将数据动态地渲染到 HTML 模板中,而 Python jinja2 模版技术正是为此而生的。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/42741.html

要了解jinja2,那么需要先理解模板的概念。模板在 Python 的web开发中广泛使用,它能够有效的将业务逻辑和页面逻辑分开,使代码可读性增强、并且更加容易理解和维护。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/42741.html

模板简单来说就是一个其中包含 占位变量 表示 动态 部分的文件,模板文件在经过动态赋值后,返回给用户。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/42741.html

Jinja2:FLASK使用Python进行模板渲染的艺术
模板渲染流程

Jinja2简介

Jinja2 是一个流行的 Python 模板引擎,它可以帮助我们将数据渲染到各种格式的文档中,如 HTML、XML、Markdown 等。Jinja2 具有以下几个特性:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/42741.html

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

安装

使用 pip 命令可以很容易地安装 Jinja2:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/42741.html

pip install Jinja2

基本语法

Jinja2 的基本语法与 Python 很相似,包括变量、表达式、控制结构等。下面是一些示例:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/42741.html

<!-- 变量 -->
<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 %} 语法。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/42741.html

模板继承和包含

模板继承

Jinja2中最强大的部分就是模板继承。模板继承允许我们创建一个基本(骨架/Base)文件,其他模版文件从该骨架文件继承,然后针对需要的地方进行修改。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/42741.html

Jinja2的Base文件中,利用 block 关键字表示其包含的内容可以进行修改。可以帮助我们避免重复的代码和布局。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/42741.html

下面是一个示例:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/42741.html

<!-- 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,并覆盖了其中的标题和内容块。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/42741.html

模板包含

除了模板继承之外,Jinja2 还支持模板包含,可以将重复的代码抽象为一个单独的模板,然后在其他模板中引用它。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/42741.html

这可以帮助我们避免重复的代码和布局。下面是一个示例:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/42741.html

<!-- 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,以构建完整的页面。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/42741.html

使用模板包含可以帮助我们更好地组织代码和布局,使代码更易于维护和扩展。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/42741.html

过滤器和控制结构

变量可以通过 过滤器 进行修改,过滤器可以理解为是jinja2里面的内置函数字符串处理函数文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/42741.html

常用的过滤器有:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/42741.html

过滤器名称说明
safe渲染时值不转义
capitialize把值的首字母转换成大写,其他子母转换为小写
lower把值转换成小写形式
upper把值转换成大写形式
title把值中每个单词的首字母都转换成大写
trim把值的首尾空格去掉
striptags渲染之前把值中所有的HTML标签都删掉
join拼接多个值为字符串
replace替换字符串的值
round默认对数字进行四舍五入,也可以用参数进行控制
int把值转换成整型

除了上述特性,Jinja2 还有其他一些有用的功能,下面介绍其中几个:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/42741.html

安全过滤器

在模板中渲染用户提供的数据时,安全性是一个非常重要的问题。Jinja2 提供了一个安全过滤器,可以帮助我们过滤掉一些危险的 HTML 标签和属性,以防止 XSS 攻击等安全问题。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/42741.html

安全过滤器示例:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/42741.html

{{ user_input|safe }}

循环控制结构

除了基本的循环结构之外,Jinja2 还提供了一些高级的循环控制结构,比如 breakcontinue 和 loop.index0 等。这些控制结构可以帮助我们更好地控制循环过程。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/42741.html

在for循环中,jinja2提供了一些特殊的变量,用以来获取当前的遍历状态:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/42741.html

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

循环控制结构示例:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/42741.html

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

自定义全局变量

除了在模板中定义变量之外,Jinja2 还支持在 Python 代码中定义全局变量,然后在模板中使用。这可以帮助我们更好地组织代码和数据。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/42741.html

自定义全局变量示例:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/42741.html

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,然后将它添加到模板引擎的全局变量中。最后,我们使用模板引擎渲染了一个模板,并输出了结果。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/42741.html

使用Jinja2进行渲染

jinja2模块中有一个名为Enviroment的类,这个类的实例用于存储配置和全局对象,然后从文件系统或其他位置中加载模板。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/42741.html

基本使用方法

大多数应用都在初始化的时候创建一个Environment对象,并用它加载模板。Environment支持两种加载方式:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/42741.html

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

PackageLoader

参数:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/42741.html

  • • PackageLoader()的两个参数为:python包的名称,以及模板目录名称。
  • • get_template():获取模板目录下的某个具体文件。
  • • render():接受变量,对模板进行渲染

使用包加载器来加载文档的最简单的方式如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/42741.html

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包下,可以直接访问系统中的文件文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/42741.html

总结

Jinja2 是一个强大而灵活的 Python 模板引擎,它可以帮助我们将数据渲染到各种格式的文档中。它具有简单而灵活的语法、支持模板继承和包含、支持过滤器和控制结构等特性。如果你需要在 Python 中使用模板引擎,Jinja2 是一个不错的选择。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/42741.html

当然,除了可以在 Python Web 开发过程中使用Jinja2模版,如果大家在做自动化脚本(自动化用例)时也可以使用它,可以根据相关自动化信息(比如:用例编号、步骤、断言等)批量生成不同自动化测试用例(脚本)。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/42741.html

  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/bc/42741.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定