【问题标题】:Tornado Invalid x-www-form-urlencoded body: 'latin-1' codec can't encode characters in position 774-777: ordinal not in range(256)Tornado 无效的 x-www-form-urlencoded 正文:“latin-1”编解码器无法编码位置 774-777 中的字符:序数不在范围内(256)
【发布时间】:2019-09-04 13:01:38
【问题描述】:

我正在使用 tornado 来接受一些我无权访问的客户端发送的数据。如果数据中只出现英文字符,一切正常。当 utf-8 编码的汉字(3 个字节)包含在数据中时,Tornado 会给出这个警告,并且“get_argument”函数根本无法得到任何东西。

我调试并将我的代码简化为最简单的代码,但仍然出现警告

class DataHandler(tornado.web.RequestHandler):
    def post(self):
        print("test")
        print(self.get_argument("data"))
        print("1")

application = tornado.web.Application([
    (r"/data", Data),
])

application.listen(5000)
tornado.ioloop.IOLoop.instance().start()

数据的格式如下:

data={"id":"00f1c423","mac":"11:22:33:44:55:66"}

数据是 x-www-form-urlencoded 和 WireShark 显示汉字是完美的 3 字节 utf-8,以 E(1110) 开头。警告(774-777)中提到的位置是汉字开始的位置,它总是5个字节,尽管汉字发生了变化。

我对警告中的“编码”感到困惑。实际上,我对代码中的编码没有做任何事情,所以我认为 Tornado 在 RequestHandler 类中就是这样做的。但是由于 Tornado 默认使用 utf-8 编解码器,那么这个 latin-1 是从哪里来的呢?最重要的是,我该如何解决?

【问题讨论】:

  • 警告是否来自print 而不是龙卷风?尝试在您的环境变量中设置 PYTHONIOENCODING=utf-8。
  • @BenDarnell 我在windows环境变量中添加了这个,问题依然存在。
  • @BenDarnell 即使我在处理程序中什么都不做,问题仍然存在
  • 问题其实来自函数get_argument。如果存在编解码器错误,则无法获取正确的 POST 参数。我现在正在使用烧瓶来处理请求。我猜想使用带有 tornado WSGIContainer 的烧瓶会导致更多的开销,但至少它可以工作。
  • 顺便说一句,我仍然收到有关“latin-1”编解码器的这些警告,但是尽管编解码器错误,flask 还是设法获得了正确的参数

标签: python python-3.x character-encoding tornado


【解决方案1】:

这将不再是问题。 Tornado 进行了一些更改以支持 x-www-form-urlencoded 正文,其值由未通过 url 编码为 ascii 的编码字节组成。

见:tornado merge request

还有:github issue #2733

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    相关资源
    最近更新 更多