【问题标题】:Invalid unicode strings in Flask, when using parameters in routes在路由中使用参数时,Flask 中的 unicode 字符串无效
【发布时间】:2018-03-12 15:27:52
【问题描述】:

我使用 Flask 运行 RESTful 服务并发现,当值作为参数传递时,Unicode 字符没有正确传递。

#!/usr/bin/env python
# -*- coding: utf-8 -*- 

...

@app.route('/search/<query>')
def Search(query):
    result = { "result": query }
    return jsonify(result), 200

当我使用带有 URL 的 REST 客户端调用服务时...

http://localhost/search/zürich

...输出如下所示:

{
    "result": "z\ufffdrich"
}

当像这样对查询字符串进行硬编码时:

@app.route('/search/<query>')
def Search(query):
    result = { "result": "Zürich" }
    return jsonify(result), 200

...输出已正确编码:

{
    "result": "Zürich"
}

所以我在 Flask config options 设置中进行了挖掘,并将选项参数“JSON_AS_ASCII”设置为 false。

默认情况下,Flask 将对象序列化为 ascii 编码的 JSON。如果设置为 False Flask 将不会编码为 ASCII 并按原样输出字符串并返回 unicode 字符串。 jsonify 会自动将其编码为 utf-8,然后用于传输。

这是 Flask 中的错误还是我错过了 Flask 配置设置中的任何内容?

【问题讨论】:

标签: python flask flask-restful


【解决方案1】:

本文档意味着如果

app.config['JSON_AS_ASCII'] = False

输出将是 unicode。

所以它应该设置为True 以获取ASCII 格式的输出,这正是你想要的。

【讨论】:

  • 这正是我在 Flask 配置中所做的。但是,它不能解决将 unicode 字符串正确处理为函数参数的问题。甚至控制台输出也显示不正确的编码:127.0.0.1 - - [13/Mar/2018 10:15:26] "GET /search/Z�rich HTTP/1.1" 200 -
  • 我能够通过对查询字符串进行 urlencoding 来解决问题。因此,我将 URL 称为:localhost/search/Z%C3%BCrich,而不是 localhost/search/zürich。这解决了问题。
  • 当然,这是一种解决方法。您可以通过以 Unicode 格式发送查询来获得所需的结果,这可能会有所帮助:link
  • 我正在研究我的路线,出于好奇,我用“GET /subscribe/zürich@test.com”200 测试了这个场景,我得到了预期的回复。我正在使用Response(json.dumps({'result:data'})data 变量包含查询响应。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-15
  • 2015-05-07
  • 2016-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多