Jinja2 转储到对象中?

Jinja2 dump into an object?

我希望能够转储到一个对象中。

根据文档,我可以转储到文件或类似对象的文件中。

我可以使用什么作为对象文件?

Obs.: 我不想保存也不想显示。它是根据存储在数据库中的数据动态创建的路由器的可下载配置模板。

env = Environment(autoescape=False, optimized=False)    

config_file = None
device_config = None
device_config = env.from_string(config_template.config)
device_config.stream(
  STR         = site.location.upper()[:4],
).dump(config_file)

原因是我想使用内容配置将文件输出到带有 django 的用户浏览器。

编辑: 用 stringIO

测试
import StringIO
>>> config_file = StringIO
>>> device_config = None
>>> device_config = env.from_string(config_template.config)
>>> device_config.stream(
...   STR         = site.location.upper()[:4],
... ).dump(config_file)
Traceback (most recent call last):
  File "<console>", line 3, in <module>
  File "/usr/lib/python2.7/site-packages/jinja2/environment.py", line 1167, in dump
    fp.write(item)
AttributeError: 'module' object has no attribute 'write'
>>>

谢谢

一般来说,类文件对象只是在某种程度上像文件一样的东西(通常通过实现 read and/or write)。我喜欢 Check if object is file-like in Python.

的答案

因此,在您的情况下,如果您的 config_file 对象属于不是从字符串类型派生的类型并且实现了 write 方法,这似乎就足够了。您可以通过快速查看 jinja2.TemplateStream.dump.

的来源来验证这一点

我从未使用过 jinja2,但我怀疑您可以使用 StringIO 来获取所需的字符串形式的内容。

以下应该可以工作,但我不能(轻松地)测试它...

from StringIO import StringIO

env = Environment(autoescape=False, optimized=False)

sio = StringIO()

device_config = env.from_string(config_template.config)
device_config.stream(
  STR         = site.location.upper()[:4],
).dump(sio)

content = sio.getvalue()

但是,如果您只想要一个字符串,看起来您应该改用 render() 方法...

env = Environment(autoescape=False, optimized=False)

device_config = env.from_string(config_template.config)
content = device_config.render(
  STR         = site.location.upper()[:4],
)

...但是,同样,我不能轻易测试它。