【问题标题】:Tornado decoding post arugment fails with UnicodeDecodeErrorTornado 编码后参数因 UnicodeDecodeError 而失败
【发布时间】:2014-05-14 06:19:05
【问题描述】:

有些人一直在使用我的 Tornado 应用程序并发出包含以下字符的 POST 请求:¡

Tornado 无法解码该值并最终出现以下错误:HTTP 400: Bad Request (Invalid unicode in PARAMNAME: b'DATAHERE')

所以我做了一些调查,得知在请求正文中,我收到了相应字符的%A1,python的decode方法对utf-8编码没有困难。

但是,在对这个值进行 URL 解码后,Tornado 以 \xa1 作为字符结束,并尝试使用 utf-8 对其进行解码但失败了,因为这实际上是 ISO-8859-1编码。

那么,解决此问题的适当方法应该是什么?因为用户正在发送有效的输出,所以我不想丢失这些数据。

【问题讨论】:

    标签: python-3.x encoding tornado


    【解决方案1】:

    最好的答案是确保客户端始终发送 utf8 而不是 iso8859-1(这曾经需要像 rails snowman 这样的奇怪技巧;我不确定当前的技术水平)。如果您不能这样做,请覆盖 RequestHandler.decode_argument (http://www.tornadoweb.org/en/stable/web.html#tornado.web.RequestHandler.decode_argument),它可以查看原始字节并决定如何解码它们(或者如果您此时不想解码,则将它们原封不动地传递)。

    【讨论】:

    • 感谢您的回答。我实际上通过覆盖decode_argument 解决了这个问题。但我在想,如果 Python 字节解码方法可以成功解码上述字符以进行 utf-8 编码,Tornado 不应该能够成功解码字符吗?
    猜你喜欢
    • 2019-09-28
    • 1970-01-01
    • 2020-03-10
    • 2018-10-18
    • 1970-01-01
    • 2021-09-22
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多