Pyramid app"标题名称必须是latin1 string"来自WebTest的AssertionError

时间:2018-04-17 13:42:31

标签: python pyramid wsgi webtest

我如何处理"标题名称必须是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>

1 个答案:

答案 0 :(得分:1)

添加补间str() - 包装所有响应标头似乎是一个很好的修复:

str()

然后,一旦不再需要支持Python 2,就可以删除此补间。