【发布时间】:2021-06-29 17:33:58
【问题描述】:
我在 Flask 中以 JSON 格式从 API 获取数据,并尝试将其呈现为 Jinja 模板作为 RSS,但 JSON 中的字符(例如撇号和 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 进行解码:
Python Selenium ().text returns "’" instead of apostrophe (')
我收到一个错误:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x91 in position 20: invalid start byte
我想知道是否有某种方法可以使用我发送到 jinja 模板的标头来解决此问题,或者可以放置在 Jinja 模板本身中以允许存在诸如弯引号之类的东西。
【问题讨论】:
-
@MichaelRuth - 不是真的。我知道这里的编码存在一些问题 - 我对问题添加了更多说明。
-
您是否尝试使用
<?xml version="1.0" encoding="UTF-8" ?>显式设置XML 编码?您是否尝试使用application/rss+xml; charset=utf-8在 Content-Type 标头中设置字符集? -
@KarlSutt - 内容类型标头是缺失的部分! (我在 xml 标签中有编码,但它不起作用)。随意写这个作为答案,我会接受。
-
好东西——很高兴你能成功!我已经添加了答案。
标签: python json flask rss jinja2