Python 3 中的 Jinja2 模板渲染带有“b”前缀和引号的字节

neu*_*ino 6 jinja2 python-3.x

我正在将一个 Flask 应用程序从 python 2 转换为 3,

Jinja2 现在用尾随 b 和单引号呈现字节,例如,b'a123'虽然我需要它们呈现为a123.

所有 urlsafe 字符串都会发生这种情况,这些字符串在 python 2 中以字符串形式出现——而不是 unicode——并根据需要进行渲染。现在它们是字节

我想避免每次检查类型并添加 .decode('utf-8)

lit*_*3rd 0

我遇到同样的问题。也许你的问题已经解决了,因为这个问题已经过去这么久了。

在我的问题中,我使用“rb”模式打开文件,read()文件处理程序的方法将返回<type 'bytes'>,因此 jinja2Template.render()还将返回字符串的字符串包装器。(只是你称之为带有前缀“b”和引号的字节)

with open("file.txt", "rb") as f:
    text = f.read()
    # type(text) -> <class 'bytes'>
    template = Template(f.read())
    template.render(kwargs)
Run Code Online (Sandbox Code Playgroud)

当我用“r”修改打开模式后,这次一切都按预期工作。

with open("file.txt", "r") as f:
    text = f.read()
    # type(text) -> <class 'str'>
    template = Template(text)
    template.render(kwargs)
Run Code Online (Sandbox Code Playgroud)

所以问题是Template构造函数中真实参数的类型。