Jinja2 render和generate函数

Jinja2是一个灵活的Python模板引擎,模仿Django模板语言设计,适用于生成HTML、XML等静态页面。它提供了丰富的语法,如变量、过滤器、测试、控制结构、宏和继承等。通过`Template`对象或`Environment`对象进行模板渲染,支持自定义过滤器和测试函数。Jinja2还有多种加载器,如FileSystemLoader、PackageLoader等,方便从不同源加载模板。

Jinja2

本文全文都来自:欢迎来到 Jinja2 — Jinja2 2.7 documentation

简介

jinja2 是一个模仿 Django 模板语言而重新开发的模板引擎,因为 Django 模板引擎限制比较多,因此有人开发出了 jinja2 这个库。所以如果你比较熟悉 Django 模板,那么 jinja2 你也很快就能了解。

安装

pip install Jinja2

基本使用

from jinja2 import Template

# 使用字符串,创建一个模板。模板包含了一个变量 {
  
  { name }}
temp = Template("<p>{
  
  { name }}</p>")

# 给模板传递变量,并渲染
content = temp.render(name="Hello")  # 可以传递关键字参数
# content = temp.render({"name": "Hello"})  # 也可以传递字典类型

print(content)

{ {}} 是用来在模板中声明变量的。模板自带了一个 render() 函数,可以给模板传递变量(context,也叫上下文变量),然后渲染它的内容。

Template 对象

模板对象, 就是我们上面用到的:

from jinja2 import Template

temp = Template("<p>{
  
  { name }}</p>")
content = temp.render(name="Hello")

print(content)

比较大的模板文件,可以使用生成器,来减少内存压力:

from jinja2 import Template

temp = Template("{
  
  { name }}")
gen = temp.generate(name="Wang")  # 返回的是生成器
for g in gen:
	print(g)  # 渲染后的内容

Template 对象常见的属性和方法:

  • globals

    该模板的全局变量字典。修改这个字典是不安全的,因为它可能与其它模板或加载这个模板的环境共享这个全局字典。

  • name

    模板的加载名。如果模板是从字符串加载的,这个值为 None 。

  • filename

    模板文件的文件名,如果不是从文件中加载的,这个值为 None 。

  • render([context])

    根据传递的上下文,来渲染模板

  • generate([context])

    和 render 类似。如果一个模板文件很大,我们可以使用这个函数,来返回一个生成器缓解内存压力。然后迭代这个生成器,来获取渲染后的内容。

  • stream([context])

    和 generate() 一样,也能渲染模板,只不过返回一个 TemplateStream 对象。

TemplateStream 对象

当我们对 Template 对象使用 .stream() ,就可以渲染模板并返回一个模板流。它有两个方法:

  • disable_buffering()

    禁用输出时缓存

  • dump(fp, encoding=None, errors='strict')

    它可以将整个数据流保存到文件中,譬如:

    Template('Hello { { name }}!').stream(name='foo').dump('hello.html')

Environment 对象

除了上面我们介绍的直接使用 Template 对象,我们还可以使用 Environment 对象,来保存一些配置,譬如:

from jinja2 import Environment, PackageLoader, Template

# 声明一个 package 加载器,会自动去 temp 这个 python包下的 templates 文件夹找所有的文件,即:./temp/templates/*.*
loader = PackageLoader("temp", "templates")
env = Environment(loader=loader)  # 生成环境

template = env.get_template("test.html")  # 加载某个文件,会从:./temp/templates/ 路径下自动查找这个 test.html

print(template.render(name="ahha"))

Environemt 的好处是,可以保存一些配置,以后所有使用这个环境所获取的模板,都会统一使用这个配置。

我们可以通过 env.get_template() 来获取某个模板对象,然后通过 template_obj.render(context) 来渲染模板。

Environment 参数:

  • block_start_string
    • 声明 block 时的起始字符串,默认: '{%'. (所谓 block,可以看作一个代码块,譬如:{% if 3 ==3 %} ... {% endif %}
  • block_end_string
    • 声明 block 时的结束字符串,默认: '%}'.
  • variable_start_string
    • 声明 变量 时的起始字符串,默认: '{ {'.
  • variable_end_string
    • 声明 变量 时的结尾字符串,默认: '}}'.
  • comment_start_string
    • 声明 注释 时的起始字符串,默认: '{#'.
  • comment_end_string
    • 注释的结尾字符串: '#}'.
  • line_statement_prefix
    • 行语句的起始字符, 模板中以此字符开头的行, 会被当成语句执行 行语句.
  • line_comment_prefix
    • 注释的起始字符,模板中如果以此字符开头,会被当成注释(上面我们说过默认的注释是{# #}): See also 行语句.
  • newline_sequence
    • 为序列开启新行。必须是 '\r''\n' or '\r\n'. 默认: '\n'
  • extensions
    • 扩展插件
  • autoescape
    • 如果设置成 True,会自动转义一些特殊字符
  • loader
    • 模板加载器
  • auto_reload
    • 如果模板更改,会自动重新加载模板(为了性能,最好设置成 False)

Environment 对象的一些属性:

  • filters

    该环境的过滤器字典。只要没有加载过模板,添加新过滤器或删除旧的都是安全的。自定义过滤器见 自定义过滤器 。有效的过滤器名称见 标识符的说明 。

  • tests

    该环境的测试函数字典。只要没有加载过模板,修改这个字典都是安全的。 自定义测试见 see 自定义测试 。有效的测试名见 标识符的说明 。

  • globals

    一个全局变量字典。这些变量在模板中总是可用。只要没有加载过模板,修 改这个字典都是安全的。更多细节见 全局命名空间 。有效的 对象名见 标识符的说明 。

  • add_extension(extension)

    给环境添加一个扩展

  • from_string(source

评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值