【问题标题】:Does flask jsonify support UTF-8?烧瓶 jsonify 是否支持 UTF-8?
【发布时间】:2016-04-02 20:37:51
【问题描述】:

我一直在使用烧瓶和 jsonify 进行实验。有用。但不支持 utf-8 字符(土耳其字符)。我正在使用字典。

if api_key in key_list:
    quotes = {
                'ataturk':
                ['Hayatta En Hakiki Mursit Ilimdir Fendir',
                 'Birgün benim naciz bedenim'],
                  'mahatma gandhi':
                ['Happiness is when what you think, what you'
                 'say,and what you do are in harmony.']
             }

    get_quote = quotes[karakter(author.lower(), harfler)]

    quote = {
               'quotes': random.choice(get_quote),
            }

    return jsonify(quote)

我尝试过编码,但它不起作用。我在调试模式下收到此错误:

AttributeError: 'dict' 对象没有属性 'encode'

我该如何解决这个问题?

【问题讨论】:

  • 你能解释一下为什么你想避免"Birg\u00fcn"吗?那是完全有效的 JSON,当你解码 JSON 时,它将成为你想要的字符串。

标签: python-3.x utf-8 flask


【解决方案1】:

你是对的,jsonify 不支持 UTF-8 字符。但是,它确实很好地支持 Unicode 字符。

考虑这两个程序:

# http server
from flask import Flask, jsonify
app = Flask(__name__)

@app.route('/')
def root():
    return jsonify({'quote':'Birgün'})

if __name__=='__main__':
    app.run(debug=True)

 

# http client
import requests
import unicodedata
r = requests.get('http://localhost:5000/')
j = r.json()
u = j['quote'][4]
print("%s: %d %x %s\n"%(u, len(u), ord(u), unicodedata.name(u)))

如您所见,http 客户端获取 JSON,对其进行解码,并检查“Birgün”中的“ü”。

结果应该清楚地表明 ü 在端到端的旅程中幸存下来,从 Python3 字符串,通过 JSON 和 HTTP,再回到 Python3 字符串。

ü: 1 fc LATIN SMALL LETTER U WITH DIAERESIS

编辑:说了这么多,有一个configuration option 将强制jsonify() 表现得如你所愿:

app.config['JSON_AS_ASCII'] = False

【讨论】:

  • 配置选项的更改对我有用 :) 使用这种方法有什么缺点吗?
【解决方案2】:

在引号前添加一个 u,例如u'quote bla bla bla'

【讨论】:

  • 我想我误解了。我的输出如下: Birg\u00fcn beim naciz bedenim
  • jsonify 不将 dict 作为第一个参数,但它需要 *args ,其中每个参数是在 json 响应中创建的关键。您收到该错误是因为 jsonify 正在尝试在 dict 上运行编码,这显然是不可能的。
  • 我已经更新了答案以获得完整的示例。请尝试一下,它应该可以工作。
  • 您对 dict 替代方案有何建议?我的字符集问题。我认为 jsonify 不支持 utf-8 字符。
  • 看我的回答。使用 jsonify(quotes=random.choice(get_quote))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-17
  • 2021-12-26
  • 2012-01-10
  • 2011-02-01
  • 2018-08-07
  • 2014-02-03
  • 1970-01-01
相关资源
最近更新 更多