Flask1.0.2系列(五) 模板

英文原文地址:http://flask.pocoo.org/docs/1.0/templating/

若有翻译错误或者不尽人意之处,请指出,谢谢~


        Flask利用Jinja2作为模板引擎。当然你也可以使用其他不能的模板引擎,但是你仍然需要安装Jinja2来运行Flask本身。这个要求是启用丰富扩展所必须的。扩展是可以依赖于Jinja2而存在的。

        这一章仅仅对如何将Jinja2集成到Flask中做一个快速介绍。如果你想要学习模板引擎提供的语法,请前往Jinja2 Template Documentation获取更多信息。


1. Jinja的设置

        除非用户自定义,否则Jinja2通过Flask进行配置的过程如下:

        ● 当使用render_template()时,所有模板后缀为.html,.htm,.xml,.xhtml的文件的自动转义功能是默认开启的。

        ● 当使用render_template_string()时,所有字符串的自动转义功能是默认开启的。

        ● 模块可以通过{% autoescape %}标签来选择/退出自动转义功能。

        ● Flask在Jinja2的上下文中插入了几个全局函数和帮助方法,此外还有默认情况下的值。


2. 标准上下文

        默认情况下,Jinja2模板有以下全局变量:

Config

        当前配置对象(默认为flask.config)

        注意:在0.10版本有更改,现在即使是导入的模板,也是可以使用的。

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


3. 标准过滤器

        除了Jinja2本身的过滤器外,Jinja2还提供了这些过滤器:

tojson()

        这个方法将给定的对象转换为JSON表示的对象。如果你想要动态生成JavaScript,那么这是非常有用的。

        需要注意,在脚本标签中的内容是不会被转义的,所以如果你打算在脚本标签中使用它,请确保在Flask0.10及之前版本中使用“|safe”来禁用转义:

<script type=text/javascript>
    doSomethingWith({{ user.username|tojson|safe }});
</script>


4. 操作自动转义

        自动转义的概念是为你将特殊字符进行自动转义。HTML(或者XML,XHTML)的特殊字符包括&、>、<、"、'。因为这些字符在文档中携带了特定的含义,如果你想要在文本中使用它们,那么你就需要使用实体来替换它们。不这样做的话,不仅会导致这些字符在文本中无法正常工作,还会导致安全问题(参见Cross-Site Scripting(XSS)文档)。

        然而有时候你需要在模板中关闭自动转义的功能。如果你想要显示地注入HTML到页面中,这就是可能发生的事。比如,如果HTML来自于一个专门生成安全HTML的系统。

        这里有三种方法可以实现在模板中关闭自动转义:

        ● 在Python代码中,将HTML字符串包裹在一个Markup对象中,然后将这儿对象传递给模板。这是最常用且推荐的方式。

        ● 在模板中,使用“|safe”过滤器来显示地标记一个字符串为安全的HTML({{ myvariable|safe }})。

        ● 临时关闭整个自动转义方法。

        为了在模板中关闭自动转义方法,你可以使用{% autoescape %}块:

{% autoescape false %}
    <p>autoescaping is disabled here
    <p>{{ will_not_be_escaped }}
{% endautoescape %}

        任何时候再使用这种方式的时候,请务必非常仔细地使用这个块。


5. 注册过滤器

        如果你想要在Jinja2中注册你自己的过滤器,你有两种方法可以实现这个目的。你既可以使用jinja_env将他们添加到应用程序环境中,也可以使用template_filter()修饰符。

        下面两个示例均是翻转一个对象:

# use template_filter()
@app.template_filter('reverse')
def reverse_filter(s):
    return s[::-1]


# use jinja_env
def reverse_filter(s):
    return s[::-1]


app.jinja_env.filters['reverse'] = reverse_filter

        注意,在使用修饰符方法的时候,如果你想要使用方法的名称作为过滤器的名称,那么修饰符的参数可以不传。一旦注册成功,你就可以在你的模板中使用这个过滤器,使用方式就像Jinja2的内置过滤器一样,举个栗子,在上下文中如果你有一个Python列表叫做mylist:

{% for x in mylist | reverse %}
{% endfor %}


6. 上下文处理器

        为了将新变量自动注入到一个模板的上下文中,Flask因此存在叫做上下文处理器(context processors)的东西。上下文处理器在模板被渲染之前就已经运行,并且其可以将新的值注入到模板上下文中。上下文处理器是一个方法,这个方法返回一个字典。这个字典的键和值随后会合并到模板上下文中,并适用于应用程序中的所有模板:

@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=format_price)

        上面的上下文处理使format_price方法适用于所有模板:

{{ format_price(0.33) }}
        你也可以将format_price创建为一个模板过滤器。但是这里只是为了演示在一个上下文处理器中怎么传递方法。

猜你喜欢

转载自blog.csdn.net/regandu/article/details/80164229
今日推荐