Jinja2 笔记
大部分摘自网上,方便平时查阅【更新ing…】
介绍
Jinja2:Jinja
是日本寺庙的意思,并且寺庙的英文是temple
和模板的英文template
的发音类似。Jinja2
是默认的仿Django
模板的一个模板引擎,由Flask
的作者开发。它速度快,被广泛使用,并且提供了可选的沙箱模板来保证执行环境的安全,它有以下优点:
- 让前端开发者和后端开发者工作分离。
- 减少
Flask
项目代码的耦合性,页面逻辑放在模板中,业务逻辑放在视图函数中,将页面逻辑和业务逻辑解耦有利于代码的维护。 - 提供了控制语句、继承等高级功能,减少开发的复杂度。
模版
{{ ... }}
:装载一个变量,模板渲染的时候,会使用传进来的同名参数这个变量代表的值替换掉。{% ... %}
:装载一个控制语句。{# ... #}
:装载一个注释,模板渲染的时候会忽视这中间的值。
变量
在模板中添加变量,可以使用(set)语句。
1 |
{% set name='xx' %} |
with
语句来创建一个内部的作用域,将set
语句放在其中,这样创建的变量只在with
代码块中才有效
1 2 3 |
{% with foo = 42 %} {{ foo }} {% endwith %} |
if语句
1 2 3 4 5 6 7 |
{% if kenny.sick %} Kenny is sick. {% elif kenny.dead %} You killed Kenny! You bastard!!! {% else %} Kenny looks okay --- so far {% endif %} |
for语句
1 2 3 |
{% for user in users %} {{ user.username|e }} {% endfor %} |
遍历字典
1 2 3 4 |
{% for key, value in <strong>my_dict.iteritems()</strong> %} <dt>{{ key|e }}</dt> <dd>{{ value|e }}</dd> {% endfor %} |
Jinja2中for循环内置常量
loop.index | 当前迭代的索引(从1开始) |
loop.index0 | 当前迭代的索引(从0开始) |
loop.first | 是否是第一次迭代,返回True\/False |
loop.last | 是否是最后一次迭代,返回True\/False |
loop.length | 序列的长度 |
注意:不可以使用continue
和break
表达式来控制循环的执行。
过滤器
过滤器是通过(|
)符号进行使用的,例如:{{ name|length }}:
将返回name的长度。
过滤器相当于是一个函数,把当前的变量传入到过滤器中,然后过滤器根据自己的功能,再返回相应的值,之后再将结果渲染到页面中。
Jinja2拥有许多过滤器:
abs(value)
:返回一个数值的绝对值。示例:-1|abs
default(value,default_value,boolean=false)
:如果当前变量没有值,则会使用参数中的值来代替。示例:name|default('xiaotuo')
——如果name不存在,则会使用xiaotuo
来替代。boolean=False
默认是在只有这个变量为undefined
的时候才会使用default
中的值,如果想使用python
的形式判断是否为false
,则可以传递boolean=true
。也可以使用or
来替换。escape(value)或e
:转义字符,会将<
、>
等符号转义成HTML中的符号。示例:content|escape
或content|e
。first(value)
:返回一个序列的第一个元素。示例:names|first
format(value,*arags,**kwargs)
:格式化字符串。比如:
12{{ <span class="hljs-string">"%s" - "%s"|format('Hello?',"Foo!") }}将输出:Helloo? - Foo!</span>last(value)
:返回一个序列的最后一个元素。示例:names|last
。length(value)
:返回一个序列或者字典的长度。示例:names|length
。join(value,d=u'')
:将一个序列用d
这个参数的值拼接成字符串。safe(value)
:如果开启了全局转义,那么safe
过滤器会将变量关掉转义。示例:content_html|safe
。int(value)
:将值转换为int
类型。float(value)
:将值转换为float
类型。lower(value)
:将字符串转换为小写。upper(value)
:将字符串转换为小写。replace(value,old,new)
: 替换将old
替换为new
的字符串。truncate(value,length=255,killwords=False)
:截取length
长度的字符串。striptags(value)
:删除字符串中所有的HTML标签,如果出现多个空格,将替换成一个空格。trim
:截取字符串前面和后面的空白字符。string(value)
:将变量转换成字符串。wordcount(s)
:计算一个长字符串中单词的个数。
宏
宏类似常规编程语言中的函数。它们用于把常用行为作为可重用的函数,取代 手动重复的工作。
这里是一个宏渲染表单元素的小例子:
1 2 3 4 |
{% macro input(name, value='', type='text', size=20) -%} <input type="{{ type }}" name="{{ name }}" value="{{ value|e }}" size="{{ size }}"> {%- endmacro %} |
在命名空间中,宏之后可以像函数一样调用:
1 2 |
<p>{{ input('username') }}</p> <p>{{ input('password', type='password') }}</p> |
如果宏在不同的模板中定义,你需要首先使用 import 。
在宏内部,你可以访问三个特殊的变量:
- varargs
- 如果有多于宏接受的参数个数的位置参数被传入,它们会作为列表的值保存在varargs 变量上。
- kwargs
- 同 varargs ,但只针对关键字参数。所有未使用的关键字参数会存储在 这个特殊变量中。
- caller
- 如果宏通过 call 标签调用,调用者会作为可调用的宏被存储在这个 变量中。
宏也可以暴露某些内部细节。下面的宏对象属性是可用的:
- name
- 宏的名称。 {{ input.name }} 会打印 input 。
- arguments
- 一个宏接受的参数名的元组。
- defaults
- 默认值的元组。
- catch_kwargs
- 如果宏接受额外的关键字参数(也就是访问特殊的 kwargs 变量),为 true 。
- catch_varargs
- 如果宏接受额外的位置参数(也就是访问特殊的 varargs 变量),为 true 。
- caller
- 如果宏访问特殊的 caller 变量且由 call 标签调用,为 true 。
如果一个宏的名称以下划线开始,它不是导出的且不能被导入。
参考:
http://docs.jinkan.org/docs/jinja2/templates.html#html
https://www.cnblogs.com/ygj0930/p/7170621.html
http://www.jianshu.com/p/31a75d3d9270
近期评论