mod_wsgi:TypeError:标头名称应为字节字符串对象,但找到类型为unicode的值



我有一个烧瓶web应用程序,使用Python 2.7.5和mod_wsgi 3.4在生产中运行。该网络应用程序在生产和本地环回中运行良好。

我最近添加了一个Flask Restplus API(3种方法(。一切都在本地运行:我的webapp运行良好,3个Rest-Api方法响应正确,swagger文档可见/在/Api/documentation上工作。

然而,在使用mod_wsgi的生产服务器上,我的web应用程序运行良好,我的rest api可以工作,但如果我访问http://mydomain/api/documentation,我在httpd错误日志中得到两个错误:

Exception occurred processing WSGI script ...
TypeError: expected byte string object for header name, value of type unicode found

编辑*在访问日志中,所有请求都是200…只有500个错误是由/api/swagger.json引起的…甚至还有200个/api/文档,这可能是swagger标题和favicon加载到浏览器选项卡中的原因,但下面是一条消息,说"没有提供api定义">

我现在正试图设置这样的响应头(字符集=UTF-8(:

resp = app.response_class(
response=json.dumps(found_resource),
status=200,
content_type='application/json; charset=UTF-8'
)
return resp

response = app.response_class(
response=json.dumps({'success': False}),
status=400,
content_type='application/json; charset=UTF-8'
)
return response

我是否为响应正确地将标头设置为字节字符串对象?任何响应都是json字典或字典的json列表。

我有点困惑,因为这个错误报告表明,使用content_type='application/json设置字符集似乎没有必要,而且可能是多余的;charset=UTF-8

响应需要是实际的字节数组,而不是字符串。你可以使用

response = app.response_class(
response=bytes(json.dumps(found_resource).encode('utf-8')),
status=200,
content_type='application/json; charset=UTF-8'
)
return response

如果您切换到Python3,则可以使用bytes(some_string, encoding='utf-8')

在我的情况下。。。修复程序使用Flask的@app.after_request.设置response.headers

显然mod_wsgi喜欢unicode头,但HTTP需要字节字符串。以下是解决方案。。。没有它,mod_wsgi不会让swagger.json加载:

@app.after_request
def after(response):
new_resp_headers = {}
for k, v in response.headers.items():
new_resp_headers[k.encode('ISO-8859-1')] = v.encode('ISO-8859-1')
response.headers = new_resp_headers
return response

最新更新