我如何处理"标题名称必须是latin1 string"来自WebTest的AssertionError
是在Pyramid应用程序在Python 2中使用from __future__ import unicode_literals
运行时发生的?
我们正在将Pyramid应用程序从Python 2迁移到3,并将from __future__ import unicode_literals
添加到我们所有的Python文件中,这导致Python 2中WebTest出现以下错误:
AssertionError: Header names must be latin1 string (not Py2 unicode or Py3 bytes type).
如果有人感兴趣,请full traceback https://www.python.org/dev/peps/pep-3333,但我认为这不是很有启发性。
只要您的应用设置了任何响应标头,就会引发AssertionError
。例如,这一行会触发它:
response.headers["Access-Control-Allow-Origin"] = "*"
由于我们有unicode_literals
这些字符串文字在Python 2中是unicode字符串,而在unicode_literals
之前它们是字节字符串,这就是为什么添加unicode_literals
触发{来自WebTest的{1}}。
在Python 3中没有发生错误。
WebTest具有此AssertionError
的原因是https://github.com/Pylons/webtest/issues/119要求HTTP响应头是本机字符串 - Python 2中的字节字符串和Python 3中的unicode字符串。这是WebTest问题和pull请求添加断言:
https://github.com/Pylons/webtest/pull/180
fiddle
AssertionError
- 像b
这样的字符串前缀会消除Python 2中的response.headers[b"Access-Control-Allow-Origin"] = b"*"
但如果测试是在Python 3中运行则会出现错误。
将AssertionError
中的字符串包裹起来str()
将在Python 2和3中修复它,但要求您查找并response.headers[str("Access-Control-Allow-Origin")] = str("*")
- 在整个应用中包装每个响应标题字符串。< / p>
答案 0 :(得分:1)
添加补间str()
- 包装所有响应标头似乎是一个很好的修复:
str()
然后,一旦不再需要支持Python 2,就可以删除此补间。