【问题标题】:"TypeError: must be str, not bytes" when trying to access request.POST field尝试访问 request.POST 字段时,“TypeError: must be str, not bytes”
【发布时间】:2015-08-26 09:51:24
【问题描述】:

我有这个基于 Pyramid 框架的网络服务,它接受多部分/表单数据请求。

当我从 cURL 发送请求时,一切正常; 但是从 Android 应用程序中,它失败并出现以下错误

TypeError: 必须是 str,而不是 bytes

当我尝试访问任何字段时:例如request.POST.get('smartphoneId', None)

不同之处在于 Android 库向字段添加了一些标头,尤其是 Content-Transfer-Encoding。从 cURL 发送的每个值如下:

--------------5f28b737bc4e4813

内容配置:表单数据; name="smartphoneId"

2

而来自 Android(经过改造):

--0e0a43aa-3156-48ee-a949-931dcc4eb8be

内容配置:表单数据; name="smartphoneId"

内容类型:文本/纯文本; charset=UTF-8

内容长度:3

内容传输编码:8BIT

999

最初 Content-Transfer-Encoding 是二进制的;我手动将其更改为 8BIT,但我得到了同样的错误。似乎Python无法解析/处理每个字段的内容。

有什么想法吗?

【问题讨论】:

  • 就像错误消息说的那样,您正在接收一个字节字符串,但该函数需要一个本机字符串。如果库尚不兼容 Py3k,则可以使用 str() 转换它或恢复为 Python 2。
  • 这是 Python 3 吗?使用decode() 方法将字节对象转换为str。
  • 确实是 Python 3;框架应该是兼容的(至少他们说),但也许还有一些错误..
  • 这不是pyramid的bug,它只是python3,pyramid完全兼容python3。
  • 如果您可以将其复制为一个小测试,或者让我完整转储失败的 HTTP 请求,请填写 WebOb 的错误报告:github.com/pylons/webob/issues 我会看看看看如果这是 WebOb 应该解决的问题。

标签: python pyramid multipartform-data


【解决方案1】:

我遇到了同样的问题(使用 Python 3.4)。为了解决这个问题,我为以下模块“webob/compat.py”创建了一个补丁:用 python cgi 3.5 的当前版本替换现有的 multi_read 补丁。现在,它起作用了。我将在 github 存储库上创建一个 pr。

https://bugs.python.org/issue27777

我为 webob 创建了一个拉取请求:https://github.com/Pylons/webob/pull/281

【讨论】:

    猜你喜欢
    • 2012-12-04
    • 2014-03-08
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    • 2020-05-29
    • 2018-12-23
    相关资源
    最近更新 更多