如何使用 Flask 在 Jinja 模板中渲染特殊字符

How to render special characters in jinja templates with flask

我在 Flask 中以 JSON 从 API 中获取数据,并试图将其作为 RSS 呈现给 Jinja 模板,但是 JSON 中的字符如 a postrophes 和 emdashes 在模板中呈现为 ’—

如何确保模板呈现正确的字符?

这是我在烧瓶中的代码:

json_resp = resp.json()
posts = json_resp['list']
template = render_template('recs.rss',posts=posts)
response = make_response(template)
response.headers.set('Content-Type', 'application/rss+xml')
return response

这是 recs.rss 模板:

<?xml version="1.0"?>
<rss version="2.0">
   <channel>
      ...
      {% for post in posts %}
      <item>
        {% if post.title %}<title><![CDATA[{{ post.title }}]]></title>{% endif %}
        ...
      </item>
      {% endfor %}
   </channel>
</rss>

如果我将其编码为 utf-8:

post_item['title'] = post_item['title'].encode('utf-8'

我在 RSS 提要中获得了 utf-8 编码,它似乎以 b 开头,而不是 u:

b'The Dirty Secret of \xe2\x80\x98Secret Family Recipes\xe2\x80\x99'

如果我尝试按照下面评论中的建议使用 utf-8 进行解码,并且 post:

我得到一个错误:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0x91 in position 20: invalid start byte

我想知道是否有一些方法可以通过我发送到神社模板的 headers 来解决这个问题,或者可以放置在神社模板本身中以允许诸如此类的东西存在弯引号。

您应该在 Content-Type header 和 application/rss+xml; charset=utf-8 中指定响应 body 编码。