模板

Flask利用Jinja2的模板引擎,,为了丰富的扩展可用,所有的扩展是依赖于Jinja2的存在

jinja2配置

除非定制,Flask中Jinja2配置如下:

所有以.html,.htm,.xml,.xhtml结尾的模板开启自动转义.

一个模板可以用{%autosecape%}标签选择开关自动转义

Flask在Jinja2上下文中插入了几个全局函数和助手,还有一些目前默认的值

标准上下文

下面的全局变量默认在jinja2模板中可用:

config:

当前配置对象(flask.config)

request:当前请求对象(flask.request)

session;当前会话对象(flask.session)

g:实现全局变量的请求范围的对象(flask.g)

url_for():flask.url_for()函数

get_flashed_messages():flask.get_flashed_messages()函数

Jinja 上下文行为

这些变量被添加到上下文变量,它们不是全局变量。不同在于,它们默认不会 在导入模板的上下文中出现。这样做,一方面是考虑到性能,另一方面是为了让事情显式透明。

对于你着意味着什么?如果你希望导入一个宏,你有两种可能来访问请求对象:

  1. 你显式地传入请求或请求对象的属性作为宏的参数。
  2. 使用 “with context” 导入宏。

在上下文中导入的方式如下:

{% from '_helpers.html' import my_macro with context %}

标准过滤器:

这些过滤器在jinja2中是可用的,也是Jinja2自带的过滤器

toJson():这个函数把给定的对象转换成JSON表示,如果要动态生成JavaScript

注意在script标签里面转义是不应该发生的,因此需要用|safe禁止转义

控制自动转义:

自动转义的概念是自动为你转义特殊字符.HTML意义下的特殊字符是&,>,<,"以及',因为这些字符在文档中表示他们特定的含义,需要在模板中禁用自动转义,这种情况可能是想要在页面显示的插入HTML,有三种方式:

在Python代码中,在传递到模板之前,用Markup对象封装HTML字符串,在模板中使用safe过滤器显示标记一个字符串安全

暂时的禁止自动转义系统,可以使用{%autoescape%}块在模板中禁用转义系统:

{%autoescape false%}

<p>autoescapeing is disabled

<p>{{will_not_be_escapes}}

{%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

在使用装饰器的情况下,

{%for x in mylist | reverse%}

{%endfor%}

上下文处理器

Flask中的上下文处理器自动向模板的上下文插入新变量,上下文处理器在模板渲染之前运行,并且可以在模板上下文中插入新值,上下文处理器是一个返回字典的函数,这个字典的键值将与应用中的所有模板上下文结合:

@app.context_processor

def inject_user():

return dict(user=g.user)

上诉的上下文处理器使得一个名为user,值为g.user的变量在模板中可用,因为g在任何模板中都是可用的,

变量不仅限于值,一个上下文处理器也可以使函数在模板中可用(由于Python允许传递函数)

@app.context_processor

def utility_processor():

  def format_price(amount,currency=u'$'):

    return u{0:.2f}{1}.format(amount,currency)

  return dict(format_price = formatprice)

上面的上下文处理器使得format_price函数在所有模板中可用:

{{format_price(0.33)}}

原文地址:https://www.cnblogs.com/suncunxu/p/11281927.html