JinJa2模版语法
Jinja 2 默认配置如下:
- 所有扩展名为
.html、.htm、.xml以及.xhtml的模板会开启自动转义 - 模板可以利用
{% autoescape %}标签选择自动转义的开关。 - Flask 在 Jinja2 上下文中插入了几个全局函数和助手,另外还有一些目前默认的值
于django的模版语言template类似,但是更强大,还可以支持函数传递,模版中的函数调用,并且传递参数等
...
return render_template("index.html", double=lambda x : x * 2)
{{ double(2) }}
{{ (".").join(["a","b","c"]) }}
模版变量
{{}}: 来表示变量名
Jinja2 模版中的变量代码块可以是任意 Python 类型或者对象,只要它能够被 Python 的 str() 方法转换为一个字符串就可以
比如,可以通过下面的方式显示一个字典或者列表中的某个元素
{{ object['key'] }}
{{ object.key }}
{{ object[0] }}
模版控制
{% %}: 定义的控制代码块,可以实现一些语言层次的功能,比如循环或者if语句,类似django的模版语言哦
{% if 条件1 %}
语句块1
{% elif 条件2 %}
语句块2
{% else %}
不符合所有条件
{% endif %}
{% for index in indexs if index!=1 %}
<li> {{ index }} </li>
{% endfor %}
过滤器
过滤器的本质就是函数。有时候我们不仅仅只是需要输出变量的值,我们还需要修改变量的显示,甚至格式化、运算等等,那么这就用到了过滤器
{{ object | filter}}
- 字符串过滤器
| 过滤器 | 说明 |
|---|---|
| safe | 禁止转义,渲染时不会转义特殊字符 |
| capitallize | 把首字母转大写,其他的字母转小写 |
| lower | 把所有的字母转小写 |
| upper | 把所有字母转大写 |
| title | 把每个单词的首字母转大写 |
| trim | 去掉首尾空格 |
| striptags | 去掉所有的HTML标签 |
| join | 将多个值拼接成字符串,类似python的join()函数 |
| replace | 替换字符串的值 |
| round | 对数字四舍五入 |
| int | 转换成int类型 |
- 列表过滤器
| 过滤器 | 说明 |
|---|---|
| first | 获取列表的第一个元素 |
| last | 获取列表的最后一个 |
| sort | 排序列表 |
| sum | 列表求和 |
| length | 列表的长度 |
模版上下文
下面的全局变量默认在 Jinja2 模板中可用:
-
config当前的配置对象 (
flask.config)0.6 新版功能.在 0.10 版更改: 现在这总是可用的,甚至在导入的模版里。 -
request当前的请求对象 (
flask.request)。当模版不是在活动的请求上下文中渲染时这个变量不可用。 -
session当前的会话对象 (
flask.session)。当模版不是在活动的请求上下文中渲染时这个变量不可用。 -
g请求相关的全局变量 (
flask.g)。当模版不是在活动的请求上下文中渲染时这个变量不可用。 -
url_for() -
get_flashed_messages()
自动转义
自动转义的概念是自动转义特殊字符。 HTML (或 XML ,因此也有 XHTML )意义下的特殊字符是 & , > , < , " 以及 '
因为这些字符在文档中表示它们特定的含义,如果你想在文本中使用它们,应该把它们替换成相应的“实体”。不这么做不仅会导致用户疲于在文本中使用这些字符,也会导致安全问题。 (见 跨站脚本攻击(XSS) )
虽然你有时会需要在模板中禁用自动转义,比如在页面中显式地插入 HTML , 可以是一个来自于 markdown 到 HTML 转换器的安全输出
我们有三种可行的解决方案:
- 在传递到模板之前,用
Markup对象封装 HTML字符串。一般推荐这个方法 - 在模板中,使用
|safe过滤器显式地标记一个字符串为安全的 HTML ({{ myvariable|safe }}) - 临时地完全禁用自动转义系统
在模板中禁用自动转义系统,可以使用 {%autoescape %}
{% autoescape false %}
<p>autoescaping is disabled here
<p>{{ will_not_be_escaped }}
{% endautoescape %
自定义过滤器
如果你要在 Jinja2 中注册你自己的过滤器,你有两种方法。你可以把它们手动添加到应用的 jinja_env 或者使用 template_filter() 装饰器。
下面两个例子作用相同,都是反转一个对象
@app.template_filter('reverse')
def reverse_filter(s):
return s[::-1]
def reverse_filter(s):
return s[::-1]
app.jinja_env.filters['reverse'] = reverse_filter
在使用装饰器的情况下,如果你想以函数名作为过滤器名,参数是可选的。
注册之后, 你可以在模板中像使用 Jinja2 内置过滤器一样使用你的过滤器,例如你在上下文中有一个名为 mylist 的 Python 列表
{% for x in mylist | reverse %}
{% endfor %}
模版函数
如果你希望在模版中,可以使用一些常用的方法,但是为了不在每个视图都定义一次,那么可以使用template_global将函数注册为模板全局函数
这样在每个模版里都可以很快乐的随意使用了
@app.template_global()
def length(s):
return len(str(s))
使用还是老样子
{{ length("abc") }}
模版静态加载
如果希望在模版中加载静态资源,无非两种办法,第一种是使用相对路径
<link href="../static/bootstrap.css" rel="stylesheet">
第二种是动态获取路径,使用模版提供的url_for方法反向解析到static目录
{{ url_for("static", filename="bootstrap.css") }}