我希望能够转储到一个对象中。
根据文档,我可以转储到文件或文件之类的对象中。
我可以将哪些文件用作对象?
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'
>>>
由于
答案 0 :(得分:1)
通常,类似文件的对象只是以某种方式表现为文件的东西(通常通过实现read
和/或write
)。我喜欢给Check if object is file-like in Python的答案。
因此,在您的情况下,如果您的config_file
对象的类型不是从字符串类型派生的,并且实现了write
方法,那么这似乎就足够了。您可以快速查看jinja2.TemplateStream.dump的来源验证这一点。
答案 1 :(得分:1)
我从未使用过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],
)
...但是,再一次,我无法轻易测试它。