【问题标题】:How to render special characters in jinja templates with flask如何使用烧瓶渲染 jinja 模板中的特殊字符
【发布时间】: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 - 不是真的。我知道这里的编码存在一些问题 - 我对问题添加了更多说明。
  • 您是否尝试使用&lt;?xml version="1.0" encoding="UTF-8" ?&gt; 显式设置XML 编码?您是否尝试使用 application/rss+xml; charset=utf-8 在 Content-Type 标头中设置字符集?
  • @KarlSutt - 内容类型标头是缺失的部分! (我在 xml 标签中有编码,但它不起作用)。随意写这个作为答案,我会接受。
  • 好东西——很高兴你能成功!我已经添加了答案。

标签: python json flask rss jinja2


【解决方案1】:

您应该在Content-Type 标头中使用application/rss+xml; charset=utf-8 指定响应正文编码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-25
    • 2014-07-17
    • 2021-04-02
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多