一篇文章搞懂Jinja2 Template Engine 模版引擎

栏目: Python · 发布时间: 5年前

内容简介:Flask和Django,以及其它很多Python框架,都默认使用在Python中,什么是模版?就是在一个静态HTML加入一些类似变量的标签,然后引擎在渲染这个HTML时候会动态的把变量填入内容,生成一个最终的HTML。什么是模版引擎?其实就是一种能解析

Flask和Django,以及其它很多 Python 框架,都默认使用 Jinja2 来作为模版引擎。

在Python中,什么是模版?就是在一个静态HTML加入一些类似变量的标签,然后引擎在渲染这个HTML时候会动态的把变量填入内容,生成一个最终的HTML。

什么是模版引擎?其实就是一种能解析 类似Python语言 的标记语言的解释器。

比如我们在HTML模版中输入一个 <p> {{ post.title }} </p> ,显然这不是真正的HTML语法。但是当Jinja2解释器读取到 {{ ...}} 后知道里面是一个变量,那么就把这个变量替换为真正的值,最后翻译出来就变成了 <p> 大标题 </p> 这样的HTML内容。

Jinja2是一个模版语言,只是类似Python,比较符合Python语法,但不完全相同!

所有的模版引擎,实际上都差不多,不管是基于VBS语言的ASP模版,还是基于 PHP 语言的PHP模版,都不是与原本语言一摸一样,而只是做到尽量一样而已。

Jinja2语言基础

注意: Jinja2 模版语言,是不区分缩进的,和纯python不同。实际上所有模版语言都不区分缩紧。

常用标记:

  • 注释: {# 这是注释 #}
  • 变量: {{ post.title }} ,或字典元素 {{your_dict['key']}} ,或列表 {{your_list[0]}}
  • 多行代码块: {% 开始 %} HTML标签 {% 结束 %}

示例:

{% if user %}
    {{ user }}
{% else %}
    hello!
    {% for index in indexs %}
        {{ index }} 
{% endfor %}

Jinja2 Filter 过滤器 (即函数)

一个filter过滤器的本质就是一个function函数。使用格式为: 变量名 | 函数

它做到的就是,把变量传给函数,然后再把函数返回值作为这个代码块的值。

如:

<!-- 带参数的 -->
{{变量 | 函数名(*args)}}

<!-- 不带参数可以省略括号 -->
{{变量 | 函数名}}

链式调用(管道式):

和命令行的pipline管道一样,可以一次调用多个函数(过滤器),如:

{{ "hello world" | reverse | upper }}

文本块调用(将中间的所有文字都作为变量内容传入到过滤器中):

{% filter upper %}
    一大堆文字
{% endfilter %}

Jinja2常用内置函数(过滤器)

字符串操作:

safe:禁用转义
<p>{{ '<em>hello</em>' | safe }}</p>

capitalize:把变量值的首字母转成大写,其余字母转小写
<p>{{ 'hello' | capitalize }}</p>

lower:把值转成小写
<p>{{ 'HELLO' | lower }}</p>

upper:把值转成大写
<p>{{ 'hello' | upper }}</p>

title:把值中的每个单词的首字母都转成大写
<p>{{ 'hello' | title }}</p>

reverse:字符串反转
<p>{{ 'olleh' | reverse }}</p>

format:格式化输出
<p>{{ '%s is %d' | format('name',17) }}</p>

striptags:渲染之前把值中所有的HTML标签都删掉
<p>{{ '<em>hello</em>' | striptags }}</p>

truncate: 字符串截断
<p>{{ 'hello every one' | truncate(9)}}</p>

列表操作:

first:取第一个元素
<p>{{ [1,2,3,4,5,6] | first }}</p>

last:取最后一个元素
<p>{{ [1,2,3,4,5,6] | last }}</p>

length:获取列表长度
<p>{{ [1,2,3,4,5,6] | length }}</p>

sum:列表求和
<p>{{ [1,2,3,4,5,6] | sum }}</p>

sort:列表排序
<p>{{ [6,2,3,1,5,4] | sort }}</p>

Jinja2 Macro 宏 (自定义函数)

Jinja2是允许自定义函数的,这样在模版中可以重复利用这个自定义函数。Jinja2称之为 Macro 宏。

定义方法:

{% macro 函数名(参数) %}
    具体的HTML内容
{% endmacro %}

<!-- 使用 -->
{{ 函数名(参数) }}

<!-- 或作为过滤器 -->
{{ 变量 | 函数名(参数) }}

关于Jinja2自定义函数的 context 上下文和环境变量的问题:

Jinja2的自定义函数“宏”,本身是没法像filter过滤器函数一样使用上下文和环境变量的。

不过可以加上 @contextfilter 装饰器达到同样的效果。

导入另一个文件的自定义函数“宏”:

假设在 macro.html 文件中我们定义了一个函数 func()

那么现在我们可以在另一个文件 reference.html 中像python导入模块一样导入它:

{% import 'macro.html' as module %}
{{ module.func() }}

Include 模版引用

Include是我们常用的操作,即定义一个框架模版(父模版),然后一个一个指定性的把子模版引入进来。

框架模版 frame.html 如下:

{% include 'header.html' %}

{% include 'body.html' %}

{% include 'footer.html' %}

Extend 模版继承

我们可以在一个父模版中定义一个 block 代码块,然后在另一个子模版中“继承”这个父模版,并重写这个 block 代码块。

不过一般模版中的父模版,都只是留出一个 block 空位,里面不写东西,特意等子模版来实现。

假设现在有一个父模版 parent.html

{% block HEADER %}
    页头部分的HTML内容。
{% endblock HEADER %}

{% block BODY %}
    正文部分的HTML内容。
{% endblock BODY %}

{% block FOOTER %}
    页脚部分的HTML内容。
{% endblock FOOTER %}

其中定义了三个block,页头、正文和页脚。

然后我们就可以定义一个模版 child.html 来继承父模版,并且只重写BODY部分:

{% extends 'parent.html' %}
{% block BODY %}
    由子页面重写改写的的HTML内容,替换父页面的BODY。。。
{% endblock BODY %}

扩展完成后,我们最终得到的结果是:

{% block HEADER %}
    页头部分的HTML内容。
{% endblock HEADER %}

{% block BODY %}
    由子页面重写改写的的HTML内容,替换父页面的BODY。。。
{% endblock BODY %}

{% block FOOTER %}
    页脚部分的HTML内容。
{% endblock FOOTER %}

Jinja2模版引用Flask路由中的内容

在Flask应用Jinja2模版时,在模版中可以直接调用Flask app中的一些公用变量和方法。

引用Flask的 request 对象:

<p> {{ request.url }} </p>
<p> {{ request.form.get('name') }} </p>

引用Flask的 url_for(...) 方法:

<!-- 它会返回我们定义的路由`app.route('/index')`所对应的URL -->
<p> {{ url_for('index') }} </p>

<!-- 它会返回我们定义的路由`app.route('/post/{post_id}')`所对应的URL -->
<p> {{ url_for('post', post_id='127') }} </p>

在模版中,我们可以引用 get_flashed_messages() 方法,获取Flask路由传来的 闪现信息

{% for msg in get_flashed_messages() %}
    <p> {{ msg }} </p>
{% endfor %}

这种闪现信息是从Flask路由中传来的,只要在路由中发一个 flash('hello') 信息,相当于弹了一个 alert() 。然后我们可以在Jinja2的模版中用 get_flashed_messages() 获得flash过来的信息列表。


以上所述就是小编给大家介绍的《一篇文章搞懂Jinja2 Template Engine 模版引擎》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

独角兽之路

独角兽之路

三节课产品社区 / 电子工业出版社 / 2016-7 / 79.00元

对2~3年以上经验的互联网人来说,最好的学习可能不是听课,而是分析各类真实的产品和运营案例。而《独角兽之路:20款快速爆发且极具潜力的互联网产品深度剖析(全彩)》正好提供了对滴滴出行、百度外卖、懂球帝、快手App等20款极具代表性的准独角兽产品的发展路径的深度分析。 通过阅读《独角兽之路:20款快速爆发且极具潜力的互联网产品深度剖析(全彩)》,你可以发现互联网产品发展的背后,或许存在着某些共......一起来看看 《独角兽之路》 这本书的介绍吧!

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具