Python--flask 模板渲染Jinja2

Python–flask 模板渲染Jinja2

模板是一个包含响应文本的文件,其中包含用占位变量表示的动态部分,其具体值只在请 求的上下文中才能知道。使用真实值替换变量,再返回最终得到的响应字符串,这一过程 称为渲染。为了渲染模板,Flask 使用了一个名为 Jinja2 的强大模板引擎。

jinja2介绍

jinja2是Flask作者开发的一个模板系统,起初是仿django模板的一个模板引擎,为Flask提供模板支持,由于其灵活,快速和安全等优点被广泛使用。

jinja2的优点

jinja2之所以被广泛使用是因为它具有以下优点:

  1. 相对于Template,jinja2更加灵活,它提供了控制结构,表达式和继承等。
  2. 相对于Mako,jinja2仅有控制结构,不允许在模板中编写太多的业务逻辑。
  3. 相对于Django模板,jinja2性能更好。
  4. Jinja2模板的可读性很棒。

jinja2语法

作为一个模板系统,它还提供了特殊的语法,我们按照它支持的语法进行编写之后,就能使用jinja2模块进行渲染。

在jinja2中,存在三种语法:

  1. 控制结构 {% %}
  2. 变量取值 {{ }}
  3. 注释 {# #}

jinja2变量过滤器

过滤器名 说明
safe 渲染值时不转义
capitalize 把值的首字母转换成
lower 把值转义成小写形式
upper 把值转换成大写形式
title 把值中每个单词的首字母都转换成大写
trim 把值的首尾空格去掉
striptags 渲染之前把值中所有的HTML标签都删掉

可以使用过滤器修改变量,过滤器名添加在变量名之后,中间使用竖线分隔。例如,下述 模板以首字母大写形式显示变量 name 的值:

    Hello, {{ name|capitalize }}

jinja2控制结构

Jinja2 提供了多种控制结构,可用来改变模板的渲染流程。本节使用简单的例子介绍其中 最有用的控制结构。
下面这个例子展示了如何在模板中使用条件控制语句:

	{% if user %}  
    Hello, {{ user }}! {% else %}
    Hello, Stranger! {% endif %}

另一种常见需求是在模板中渲染一组元素。下例展示了如何使用 for 循环实现这一需求:

<ul>
     {% for comment in comments %}
            <li>{{ comment }}</li>
     {% endfor %} 
</ul>

Jinja2 还支持宏。宏类似于 Python 代码中的函数。例如:

{% macro render_comment(comment) %}
     <li>{{ comment }}</li>
{% endmacro %} 
 
<ul>
     {% for comment in comments %}
          {{ render_comment(comment) }}
     {% endfor %}
</ul>

为了重复使用宏,我们可以将其保存在单独的文件中,然后在需要使用的模板中导入:

{% import 'macros.html' as macros %}
<ul>
      {% for comment in comments %}
            {{ macros.render_comment(comment) }}
      {% endfor %}
</ul> 

需要在多处重复使用的模板代码片段可以写入单独的文件,再包含在所有模板中,以避免 重复:

扫描二维码关注公众号,回复: 9760658 查看本文章
{% include 'common.html' %}

另一种重复使用代码的强大方式是模板继承,它类似于 Python 代码中的类继承。首先创建一个名为 base.html 的基模板:

<html> 
<head>
     {% block head %}
     <title>{% block title %}{% endblock %} - My Application</title> 
     {% endblock %}
</head>
 <body> 
      {% block body %}
      {% endblock %}
</body> 
</html>

block 标签定义的元素可在衍生模板中修改。在本例中,我们定义了名为 head、title 和 body 的块。注意,title 包含在 head 中。下面这个示例是基模板的衍生模板:

{% extends "base.html" %} 
{% block title %}Index{% endblock %} 
{% block head %}
     {{ super() }}
     <style>  
     </style> 
{% endblock %}
{% block body %} 
<h1>Hello, World!</h1> 
{% endblock %}

extends 指令声明这个模板衍生自 base.html。在 extends 指令之后,基模板中的 3 个块被 重新定义,模板引擎会将其插入适当的位置。注意新定义的 head 块,在基模板中其内容不 是空的,所以使用 super() 获取原来的内容。

发布了33 篇原创文章 · 获赞 1 · 访问量 2292

猜你喜欢

转载自blog.csdn.net/qq_40805620/article/details/100677716