为什么自动转义不默认开启?之所以自动转义不是默认的模式,且不是推荐的模式有许多原因。自动转义变量意 味着你不再会面临 XSS 问题,它也导致在模板引擎中导致巨大规模的额外处理和严 重的性能问题。因为 Python 不提供标记字符串为不安全的方式, Jinja 提供了一 个自定义的字符串类( 在显式的转义中,无论如何模板引擎都不需要运行对变量的任何安全检查。同样,一 个自然人知道不去转义永远不会包含需要转义的或先前的 HTML 标记的整数和字符串。 例如,当在一个整数和浮点数的表中迭代时,根据表的状况,模板设计者可以略过转 义,因为他知道整数和浮点数不包含任何不安全的参数。 此外, Jinja2 是一个通用模板引擎,且不只用于 HTML/XML 生成。例如你会生成 LaTeX 、 邮件 、 CSS 、 JavaScript 或是配置文件。 为什么上下文是不可修改的?当写 如果你想要修改上下文,写一个函数返回一个变量,并用 set 赋值: {% set comments = get_latest_comments() %}
加速模块是什么和为什么缺失它?要用在自动转义开启的情况下实现高性能,在老版本的 Jinja2 中转义函数也需要用纯 C 实现,如果 Jinja2 与加速模块一同安装也会使用它。 因为这个特性本身对非模板引擎也很有用,它被移动到 PyPI 上的一个独立的项 目,名为 MarkupSafe 。 Jinja2 不再伴随一个 C 实现而是纯粹的 Python 实现。无论如何,它会检查是否 存在安装好的 MarkupSafe ,如果有,使用 MarkupSafe 的 Markup 类。 所以如果你想加速,只需要导入 MarkupSafe 。 我的回溯看起来很怪异。发生了什么?如果没有编译调试支持模块并且你在使用一个没有 ctypes 的 Python 安装( Python 2.4 没有 ctypes , Jython 或 Google 的 AppEngine ) Jinja2 不能提供 正确的调试信息,且回溯可能是不完整的。这也是为什么现在不能与 Jython 或是 AppEngine 良好工作的原因,没有 ctypes 就不可能使用调试支持扩展。 如果你在 Google Appengine 开发服务器上工作,你可以把 ctypes 模块添加到 白名单来恢复回溯。这无论如何都不能用于生产环境: import os
if os.environ.get('SERVER_SOFTWARE', '').startswith('Dev'):
from google.appengine.tools.dev_appserver import HardenedModulesHook
HardenedModulesHook._WHITE_LIST_C_MODULES += ['_ctypes', 'gestalt']
这个片段的声誉见 Thomas Johansson 为什么没有 Python 2.3 支持?Python 2.3 中缺少许多在 Jinja2 中大量使用的特性。做出这个艰难的决定是因为使用即 将到来的 Python 2.6 和 3.0 版本,再为老版本 Python 维护代码更加困难。如果你确实 需要 Python 2.3 支持,你可以使用 Jinja 1 或其它仍然支持 2.3 的模板引擎。 我的宏被什么东西给覆盖了在某些情况下, Jinja 的作用域会是任意的: layout.tmpl: {% macro foo() %}LAYOUT{% endmacro %}
{% block body %}{% endblock %}
child.tmpl: {% extends 'layout.tmpl' %}
{% macro foo() %}CHILD{% endmacro %}
{% block body %}{{ foo() }}{% endblock %}
这在 Jinja2 中会打印 |
Archiver|手机版|笨鸟自学网 ( 粤ICP备20019910号 )
GMT+8, 2024-11-21 22:08 , Processed in 0.099764 second(s), 17 queries .