### 导航
- [索引](# "总目录")
- [下一页](# "测试 Flask 应用") |
- [上一页](# "福利: 应用测试") |
- [Flask 0.10.1 文档](#) »
# 模板
Flask 使用 Jinja 2 作为模板引擎。当然,你也可以自由使用其它的模板引擎,但运行Flask 本身仍然需要 Jinja2 依赖 ,这对启用富扩展是必要的,扩展可以依赖 Jinja2 存在。
本节只是快速地介绍 Jinja2 是如何集成到 Flask 中的。更多关于 Jinja2 语法本身的信息,请参考官方文档[Jinja2 模板引擎](http://jinja.pocoo.org/2/documentation/templates) [http://jinja.pocoo.org/2/documentation/templates] 。
### Jinja 配置
Jinja 2 默认配置如下:
- 所有扩展名为 .html 、 .htm 、 .xml 以及 .xhtml的模板会开启自动转义
- 模板可以利用 {%autoescape%} 标签选择自动转义的开关。
- Flask 在 Jinja2 上下文中插入了几个全局函数和助手,另外还有一些目前默认的值
### 标准上下文
下面的全局变量默认在 Jinja2 模板中可用:
config
当前的配置对象 (flask.config)
0.6 新版功能.
在 0.10 版更改: 现在这总是可用的,甚至在导入的模版里。
request
当前的请求对象 ([flask.request](# "flask.request"))。当模版不是在活动的请求上下文中渲染时这个变量不可用。
session
当前的会话对象 ([flask.session](# "flask.session"))。当模版不是在活动的请求上下文中渲染时这个变量不可用。
g
请求相关的全局变量 ([flask.g](# "flask.g"))。当模版不是在活动的请求上下文中渲染时这个变量不可用。
url_for()
[flask.url_for()](# "flask.url_for") 函数
get_flashed_messages()
[flask.get_flashed_messages()](# "flask.get_flashed_messages") 函数
Jinja 上下文行为
这些变量被添加到了请求的上下文中,而非全局变量。区别在于,他们默认不会在导入模板的上下文中出现。这样做,一方面是考虑到性能,另一方面是为了让事情显式透明。
这对你来说意味着什么?如果你想要导入一个需要访问请求对象的宏,有两种可能的方法:
1. 显式地传入请求或请求对象的属性作为宏的参数。
1. 与上下文一起(with context)导入宏。
与上下文中一起(with context)导入的方式如下:
~~~
{% from '_helpers.html' import my_macro with context %}
~~~
### 标准过滤器
这些过滤器在 Jinja2 中可用,也是 Jinja2 自带的过滤器:
tojson()
这个函数把给定的对象转换为 JSON 表示,如果你要动态生成 JavaScript 这里有一个非常有用的例子。
注意 script 标签里的东西不应该被转义,因此如果你想在 script 标签里使用它,请使用 |safe 来禁用转义,:
~~~
<script type=text/javascript>
doSomethingWith({{ user.username|tojson|safe }});
</script>
~~~
### 控制自动转义
自动转义的概念是自动转义特殊字符。 HTML (或 XML ,因此也有 XHTML )意义下的特殊字符是 & , > , < , " 以及 ' 。因为这些字符在文档中表示它们特定的含义,如果你想在文本中使用它们,应该把它们替换成相应的“实体”。不这么做不仅会导致用户疲于在文本中使用这些字符,也会导致安全问题。(见 [*跨站脚本攻击(XSS)*](#) )
虽然你有时会需要在模板中禁用自动转义,比如在页面中显式地插入 HTML ,可以是一个来自于 markdown 到 HTML 转换器的安全输出。
我们有三种可行的解决方案:
- 在传递到模板之前,用 [Markup](# "flask.Markup") 对象封装 HTML字符串。一般推荐这个方法。
- 在模板中,使用 |safe 过滤器显式地标记一个字符串为安全的 HTML( {{myvariable|safe}} )。
- 临时地完全禁用自动转义系统。
在模板中禁用自动转义系统,可以使用 {%autoescape%} 块:
~~~
{% autoescape false %}
<p>autoescaping is disabled here
<p>{{ will_not_be_escaped }}
{% endautoescape %}
~~~
无论何时,都请务必格外小心这里的变量。
### 注册过滤器
如果你要在 Jinja2 中注册你自己的过滤器,你有两种方法。你可以把它们手动添加到应用的 [jinja_env](# "flask.Flask.jinja_env") 或者使用[template_filter()](# "flask.Flask.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 %}
~~~
### 上下文处理器
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=format_price)
~~~
上面的上下文处理器使得 format_price 函数在所有模板中可用:
~~~
{{ format_price(0.33) }}
~~~
你也可以构建 format_price 为一个模板过滤器(见 [*注册过滤器*](#) ),但这展示了上下文处理器传递函数的工作过程。
© 版权所有 2013, Armin Ronacher.
- 欢迎使用 Flask
- 前言
- 给有经验程序员的前言
- 安装
- 快速入门
- 教程
- 介绍 Flaskr
- 步骤 0: 创建文件夹
- 步骤 1: 数据库模式
- 步骤 2: 应用设置代码
- 步骤 3: 创建数据库
- 步骤 4: 请求数据库连接
- 步骤 5: 视图函数
- 步骤 6: 模板
- 步骤 7: 添加样式
- 福利: 应用测试
- 模板
- 测试 Flask 应用
- 记录应用错误
- 配置处理
- 信号
- 即插视图
- 应用上下文
- 请求上下文
- 用蓝图实现模块化的应用
- Flask 扩展
- 与 Shell 共舞
- Flask 代码模式
- 大型应用
- 应用程序的工厂函数
- 应用调度
- 使用 URL 处理器
- 部署和分发
- 使用 Fabric 部署
- 在 Flask 中使用 SQLite 3
- 在 Flask 中使用 SQLAlchemy
- 上传文件
- 缓存
- 视图装饰器
- 使用 WTForms 进行表单验证
- 模板继承
- 消息闪现
- 用 jQuery 实现 Ajax
- 自定义错误页面
- 延迟加载视图
- 在 Flask 中使用 MongoKit
- 添加 Favicon
- 数据流
- 延迟请求回调
- 添加 HTTP Method Overrides
- 请求内容校验码
- 基于 Celery 的后台任务
- 部署选择
- mod_wsgi (Apache)
- 独立 WSGI 容器
- uWSGI
- FastCGI
- CGI
- 聚沙成塔
- API
- JSON 支持
- Flask 中的设计决策
- HTML/XHTML 常见问题
- 安全注意事项
- Flask 中的 Unicode
- Flask 扩展开发
- Pocoo 风格指引
- Python 3 支持
- 升级到最新版本
- Flask Changelog
- 许可证
- 术语表