Jinja2是Python下一个被广泛应用的模版引擎,他的设计思想来源于Django的模板引擎,并扩展了其语法和一系列强大的功能。

一、变量

1.1 手动传入的变量:

  • 基本类型:{{ var }}
  • 字典类型:{{ mydic [ 'key' ] }} 或 {{ mydic.key }}
  • 列表类型:{{ mylist [ myindex ] }}
  • 对象类型:{{ myobj. somemethod() }}

1.2 全局变量:

可用的全局变量:configrequestsessiong、通过上下文管理器注册到全局变量...

1.3 过滤器:

过滤器名 说明
safe 渲染值时不转义
capitalize 把值的首字母转换成大写,其他字母转换成小写
lower 把值转换成小写形式
upper 把值转换成大写形式
title 把值中每个单词的首字母都转换成大写
trim 把值的首尾空格删掉
striptags 渲染之前把值中所有的 HTML 标签都删掉
  • 使用语法:{{ var|safe }}

  • 过滤器可以嵌套使用

  • 可以自定义过滤器

二、控制结构

2.1 条件判断

{% if user="张三" %}
Hello, {{ user }}!
{% elif user="李四"%}
Hello, 李四!
{% else %}
Hello, Stranger!
{% endif %}

判断条件兼容python语法的条件判断,另外还有Jinjia模板内置判断条件:

判断条件 说明 实例
defined/undefined 环境中是否有此变量的定义 if var is defined
none 变量是否为none if var is none
number/string 数字、字符判断 ...
even/odd 奇偶判断 ...
upper/lower 大小写判断 ...

2.2 循环

Jinjia模板的循环语法如下,但原生不支持break和continue语句,可通过扩展实现app.jinjia_env.add_extension('jinjia2.ext.loopcontrols')

<ul>
{% for comment in comments %}
<li>{{ comment }}</li>
{% else %}
<li>如果循环体为空则显示这里(可选)</li>
{% endfor %}
</ul>

Jinjia模板中循环体内的内置函数:

变量 描述
loop.index 当前循环迭代的次数(从1开始)
loop.index0 当前循环迭代的次数(从0开始)
loop.revindex 到循环结束需要迭代的次数(从1开始)
loop.revindex0 到循环结束需要迭代的次数(从0开始)
loop.first 若是第一次迭代,则返回True
loop.last 若是最后一次迭代,则返回True
loop.length 当前循环的总长度
loop.cycle(a,b,c) 循环的从指定序列中取值

三、模板重用

3.1 模板宏

定义单独的宏文件(macro.html)

{% macro render_comment(comment) %}
<li>{{ comment }}</li>
{% endmacro %}

导入使用:

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

3.2 模板包含

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

{% include 'common.html' %}
{% include 'common.html' ignore missing %} #如果模板不存在,不会报错
{% include 'common.html' with/without context %} #是否携带当前页面的上下文

3.3 模板继承

Jinja2 使用 blockendblock 指令在基模板中定义内容区块。

  • 语法:{% extends "base.html" %}
  • 同名区块直接覆盖
  • 同名区块可使用super()扩展
{% extends "base.html" %}
{% block title %}Index{% endblock %}
{% block head %}
{{ super() }}
<style>
</style>
{% endblock %}
{% block body %}
<h1>Hello, World!</h1>
{% endblock %}

四、模板中的全局函数

函数 说明
url_for() 构建URL
get_flashed_messages() 获取闪现消息
range() 同python中的range函数
dict() 同python中的dict函数
cycler(* items) 常用于CSS类名的循环

五、其他

5.1 模板注释:

模板注释的语法:{{# ... #}},模板注释不会出现在HTML文档中,HTML注释会。

5.2 除HTML文档中多余的空白:

在模板标签的开始或结束添加一个 -

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

5.3 使用变量:

设置变量:{{% set a,b=(1,2) %}}

使用with实现变量的块级作用域:

{{% with %}}
{{% set a,b=(1,2) %}}
...只在区块内有效
{{% endwith %}}

Flask:Jinjia模板的更多相关文章

  1. Flask网页模板的入门

    #网页模板需要导入render_template from flask import Flask,render_template   方法一: #使用render_template模块来渲染模板文件 ...

  2. flask框架--模板

    今天又是一个精彩又无聊的一天,不过随着知识的缓慢的增加我的内心也充满了干劲,虽然前进的有些缓慢 但我不会这么容易放弃的,一定要相信自己,不要灰心 好了 ~ 不说废话了 , 我自己听的都有些受不了了 . ...

  3. Flask:Flask的模板系统和静态文件

    1.Flask模板系统 Django框架有自己独立的模板系统,而Flask是没有的,Flask默认采用jinjia2模板系统,jinjia2是仿写Django模板系统的一个第三方模块,但性能上要比Dj ...

  4. Flask 的模板渲染

    Flask 的模板渲染 渲染模板语言和django很像,都是用{{}},{%%} 注意点: 1 flask给模板传值,render_template("index.htm",use ...

  5. Flask入门之Jinjia模板的一些语法

    1. 变量表示 {{ argv }} 2. 赋值操作 {% set links = [ ('home',url_for('.home')), ('service',url_for('.service' ...

  6. 2.Flask jinjia2模板

    1.1.模板传参 (1)主程序 from flask import Flask,render_template app = Flask(__name__) @app.route('/') def he ...

  7. 第四篇flask中模板语言 jinja2

    Flask中默认的模板语言是Jinja2 首先我们要在后端定义几个字符串,用于传递到前端 STUDENT = {, 'gender': '中'}, STUDENT_LIST = [ {, 'gende ...

  8. 二.Flask 学习模板

    Flask 为你配置 Jinja2 模板引擎.使用 render_template() 方法可以渲染模板,只需提供模板名称和需要作为参数传递给模板的变量就可简单执行. 至于模板渲染? 简单来说,就是将 ...

  9. Python——Flask框架——模板

    一.渲染模板 render_template 函数把Jinja2模板引擎集成到程序中 二.Jinja2变量过滤器 过滤器名 说明 safe 渲染值是不转义 capitalize 把值得首字母转换成大写 ...

随机推荐

  1. hdu5637 Transform (bfs+预处理)

    Problem Description A list of n integers are given. For an integer x you can do the following operat ...

  2. zjnu1709 UZASTOPNI (bitset,树形dp)

    Description Petar is throwing a birthday party and he decided to invite some of the employees of his ...

  3. Educational Codeforces Round 89 (Rated for Div. 2) A Shovels and Swords B、Shuffle

    题目链接:A.Shovels and Swords 题意: 你需要一个木棍和两个钻石可以造出来一把剑 你需要两个木棍和一个钻石可以造出来一把铁锹 你现在有a个木棍,b个钻石,问你最多可以造出来几件东西 ...

  4. qmh的测试1

    题目:传送门 首先输入一个n,之后输入n个数a(1<=a<=1e7),对这n个数排序后,你需要找到所有的它们连续的长度.把这些连续的长度排序后输出 输入 输入: 8 1 5 2 7 4 5 ...

  5. 用servlet在网页中打印字符串(初接触)、servlet调用过程

    一.servlet是什么: 二.在官方文档中点servlet 这就是servlet的方法,这里说一下什么叫生命周期的方法(life-cycle methods):就是这个对象一旦创生之后一定会执行的方 ...

  6. Codeforces Round #672 (Div. 2) D. Rescue Nibel! (思维,组合数)

    题意:给你\(n\)个区间,从这\(n\)区间中选\(k\)个区间出来,要求这\(k\)个区间都要相交.问共有多少种情况. 题解:如果\(k\)个区间都要相交,最左边的区间和最右边的区间必须要相交,即 ...

  7. Codeforces Global Round 9 B. Neighbor Grid (构造,贪心)

    题意:给一个\(n\)X\(m\)的矩阵,矩阵中某个数字\(k\)表示其四周恰好有\(k\)个不为0的数字,你可以使任意位置上的数字变大,如果操作后满足条件,输出新矩阵,否则输出NO. 题解:贪心,既 ...

  8. Open3d之交互式可视化

    本篇教程介绍了Open3D的可视化窗口的交互功能. # -*- coding:utf-8 -*- import copy import numpy as np import open3d as o3d ...

  9. Linux入门详解

    Linux基础知识 Linux&Unix 说起Linux,就不得不提Unix操作系统. Unix系统号称世界上最稳定的系统,就连苹果公司也从中获取灵感开发出了移动端大名鼎鼎的IOS. Unix ...

  10. Docker应用场景和局限性

    Docker有哪些好的特性?作为一种新兴的虚拟化方式,Docker跟传统的虚拟化方式相比具有众多的优势.首先, Docker容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多.其次, Docke ...