jinjia2一:介绍及安装jinjia2

jinjia2一:介绍及安装jinjia21.介绍: jinjia2是一个模板语言,是一个现代的、设计友好的、依照django模板的python模板语言。 它速度快,被广泛使用,并且提供了可选的沙箱模板执行环境保证安全。 Jinja2 与 Mako 的性能相近,比 Django 的模板引擎或 Genshi 快 10 到

jinjia2一:介绍及安装jinjia2"

1.介绍:

jinjia2是一个模板语言,是一个现代的、设计友好的、依照django模板的python模板语言。

它速度快,被广泛使用,并且提供了可选的沙箱模板执行环境保证安全。

Jinja2 与 Mako 的性能相近,比 Django 的模板引擎或 Genshi 快 10 到 20 倍。

2.特性:

  • 沙箱中执行
  • 强大的 HTML 自动转义系统保护系统免受 XSS
  • 模板继承
  • 及时编译最优的 python 代码
  • 可选提前编译模板的时间
  • 易于调试。异常的行数直接指向模板中的对应行。
  • 可配置的语法

3.安装jinjia2:

方式一:

sudo easy_install Jinja2
sudo pip install Jinja2

方式二:

从官网下载源码包:http://pypi.python.org/pypi/Jinja2

tar -zxvf jinjia2包
cd jinji2解压后的包
sudo python setup.py install  #这样安装的前提是安装了 setuptools 或 distribute

 

这会在你的 Python 安装中的 site-packages 目录安装一个 Jinja2 egg 。

4.创建模板

最基本的方式就是通过 Template 创建一个模板并渲染它。

如果你的模板不是从字符串加载,而是文件系统或别的数据源,无论如何这都不 是推荐的方式:

>>> from jinja2 import Template
>>> template = Template('Hello {{ name }}!')
>>> template.render(name='John Doe')
u'Hello John Doe!'

 

5.常见问题

Jinja2 与 Django 兼容性如何?

Jinja2 的语法与 Django 的语法很多都匹配。但这并不意味着你可以直接在 Jinja2 中原封不动地使用 Django 模板。例如过滤器参数使用函数调用语法而不是用冒号分 隔过滤器名和参数。此外, Jinja 中的扩展接口与 Django 的有根本区别,这意味着 你的自定义标签不能再正常工作。

总体而言,因为 Jinja 模板系统允许你使用一个 Python 表达式的特定子集,你 会使用相当少的自定义扩展,且可以替代大多数的 Django 扩展。例如,不是用下 面的这样:

{% load comments %} {% get_latest_comments 10 as latest_comments %} {% for comment in latest_comments %} ... {% endfor %} 

你会更可能提供一个对象,用属性来检索数据库中的评论:

{% for comment in models.comments.latest(10) %} ... {% endfor %} 

或直接为快速测试提供模型:

{% for comment in Comment.objects.order_by('-pub_date')[:10] %} ... {% endfor %} 

请记住即使你能在模板中放置这样的东西,这也不是一个好主意。查询应该在视图代 码中执行,而不是模板中!

 

Jinaja2 不允许你在模板中放置任意的 Python 代码,也不允许全部的 Python 表达 式。操作符限定为最常用的那些,且不支持诸如列表推导式和生成器表达式等高级表 达式。这使得模板引擎易于维护,并且模板有更好的可读性。

为什么自动转义不默认开启?

之所以自动转义不是默认的模式,且不是推荐的模式有许多原因。自动转义变量意 味着你不再会面临 XSS 问题,它也导致在模板引擎中导致巨大规模的额外处理和严 重的性能问题。因为 Python 不提供标记字符串为不安全的方式, Jinja 提供了一 个自定义的字符串类( Markup 字符串)hack 这个限制来与安全和不安 全的字符串交互。

在显式的转义中,无论如何模板引擎都不需要运行对变量的任何安全检查。同样,一 个自然人知道不去转义永远不会包含需要转义的或先前的 HTML 标记的整数和字符串。 例如,当在一个整数和浮点数的表中迭代时,根据表的状况,模板设计者可以略过转 义,因为他知道整数和浮点数不包含任何不安全的参数。

此外, Jinja2 是一个通用模板引擎,且不只用于 HTML/XML 生成。例如你会生成 LaTeX 、 邮件 、 CSS 、 JavaScript 或是配置文件。

为什么上下文是不可修改的?

当写 contextfunction() 或类似的东西时,你可能会注意到上下文试图阻止 你修改它。如果你已经设法用内部的上下文 API 修改了上下文,你会注意到上下文 上发生的修改在模板中是不可见的。这个的原因是 Jinja 为性能因素,只把上下文 作为模板变量的主要数据源。

如果你想要修改上下文,写一个函数返回一个变量,并用 set 赋值:

{% set comments = get_latest_comments() %}

加速模块是什么和为什么缺失它?

要用在自动转义开启的情况下实现高性能,在老版本的 Jinja2 中转义函数也需要用纯 C 实现,如果 Jinja2 与加速模块一同安装也会使用它。

因为这个特性本身对非模板引擎也很有用,它被移动到 PyPI 上的一个独立的项 目,名为 MarkupSafe 。

Jinja2 不再伴随一个 C 实现而是纯粹的 Python 实现。无论如何,它会检查是否 存在安装好的 MarkupSafe ,如果有,使用 MarkupSafe 的 Markup 类。

所以如果你想加速,只需要导入 MarkupSafe 。

我的宏被什么东西给覆盖了

在某些情况下, Jinja 的作用域会是任意的:

layout.tmpl:

{% macro foo() %}LAYOUT{% endmacro %} {% block body %}{% endblock %}

child.tmpl:

{% extends 'layout.tmpl' %} {% macro foo() %}CHILD{% endmacro %} {% block body %}{{ foo() }}{% endblock %}

这在 Jinja2 中会打印 LAYOUT 。这是父模板在子模板之后求值的副作用。 这允许子模板传递信息到父模板。要避免这个问题,重命名父模板中的变量或宏 让它们有不同的前缀。

今天的文章jinjia2一:介绍及安装jinjia2分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/57217.html

(0)
编程小号编程小号
上一篇 2023-08-25 20:17
下一篇 2023-08-25

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注