Python Flask崩溃,ValueError:太多值无法解包

Python Flask崩溃,ValueError:太多值无法解包,python,flask,mod-wsgi,wsgi,werkzeug,Python,Flask,Mod Wsgi,Wsgi,Werkzeug,我有一个与另一个web服务通信的flask应用程序。我有一个错误,这似乎只发生在两个应用程序都在同一台服务器上运行时,但我不知道源代码是什么。Flask应用程序通过Apache中的WSGIScriptAlias托管在/tools上 [Thu May 23 13:11:44 2013] [error] [client 41.164.8.114] mod_wsgi (pid=25705): Exception occurred processing WSGI script '/opt/tools-f

我有一个与另一个web服务通信的flask应用程序。我有一个错误,这似乎只发生在两个应用程序都在同一台服务器上运行时,但我不知道源代码是什么。Flask应用程序通过Apache中的
WSGIScriptAlias
托管在
/tools

[Thu May 23 13:11:44 2013] [error] [client 41.164.8.114] mod_wsgi (pid=25705): Exception occurred processing WSGI script '/opt/tools-frontend/wsgi.py'.
[Thu May 23 13:11:44 2013] [error] [client 41.164.8.114] Traceback (most recent call last):
[Thu May 23 13:11:44 2013] [error] [client 41.164.8.114]   File "/opt/tools-frontend/ENV_1/lib/python2.7/site-packages/flask/app.py", line 1701, in __call__
[Thu May 23 13:11:44 2013] [error] [client 41.164.8.114]     return self.wsgi_app(environ, start_response)
[Thu May 23 13:11:44 2013] [error] [client 41.164.8.114]   File "/opt/tools-frontend/ENV_1/lib/python2.7/site-packages/flask/app.py", line 1689, in wsgi_app
[Thu May 23 13:11:44 2013] [error] [client 41.164.8.114]     response = self.make_response(self.handle_exception(e))
[Thu May 23 13:11:44 2013] [error] [client 41.164.8.114]   File "/opt/tools-frontend/ENV_1/lib/python2.7/site-packages/flask/app.py", line 1687, in wsgi_app
[Thu May 23 13:11:44 2013] [error] [client 41.164.8.114]     response = self.full_dispatch_request()
[Thu May 23 13:11:44 2013] [error] [client 41.164.8.114]   File "/opt/tools-frontend/ENV_1/lib/python2.7/site-packages/flask/app.py", line 1361, in full_dispatch_request
[Thu May 23 13:11:44 2013] [error] [client 41.164.8.114]     response = self.make_response(rv)
[Thu May 23 13:11:44 2013] [error] [client 41.164.8.114]   File "/opt/tools-frontend/ENV_1/lib/python2.7/site-packages/flask/app.py", line 1447, in make_response
[Thu May 23 13:11:44 2013] [error] [client 41.164.8.114]     rv = self.response_class(rv, headers=headers, status=status)
[Thu May 23 13:11:44 2013] [error] [client 41.164.8.114]   File "/opt/tools-frontend/ENV_1/lib/python2.7/site-packages/werkzeug/wrappers.py", line 627, in __init__
[Thu May 23 13:11:44 2013] [error] [client 41.164.8.114]     self.headers = Headers(headers)
[Thu May 23 13:11:44 2013] [error] [client 41.164.8.114]   File "/opt/tools-frontend/ENV_1/lib/python2.7/site-packages/werkzeug/datastructures.py", line 836, in __init__
[Thu May 23 13:11:44 2013] [error] [client 41.164.8.114]     self.extend(defaults)
[Thu May 23 13:11:44 2013] [error] [client 41.164.8.114]   File "/opt/tools-frontend/ENV_1/lib/python2.7/site-packages/werkzeug/datastructures.py", line 978, in extend
[Thu May 23 13:11:44 2013] [error] [client 41.164.8.114]     for key, value in iterable:
[Thu May 23 13:11:44 2013] [error] [client 41.164.8.114] ValueError: too many values to unpack
[Thu May 23 13:11:44 2013] [debug] mod_deflate.c(615): [client 41.164.8.114] Zlib: Compressed 590 to 372 : URL /tools/api/login/, referer: http://www.website.com/tools
API托管在同一台计算机上的不同域中,查看日志文件,它工作正常

API调用在以下函数中进行:

@app.route('/api/', methods=['GET', 'POST', 'PUT', 'DELETE'])
@app.route('/api/<path:endpoint>', methods=['GET', 'POST', 'PUT', 'DELETE'])
def api(endpoint=None):
    # extract POST/PUT variables
    dat = request.form
    if len(dat) == 0:
        # extract GET variables
        dat = request.args
    # submit request to API
    out = call_api(request.method, endpoint, dat, request.files)
    return out

我最好的猜测是您返回了一个特殊的headers字典(来自python请求),而不是一个普通的字典。烧瓶采用两种形式的集管:

{'key': 'value'}
# and
[('key', 'value')]
由于您的特殊dict未被识别为真正的dict,因此它将被视为元组列表,而元组列表失败

改变

return r.text, r.status_code, r.headers


您正在尝试在视图中设置标题吗?你能分享代码吗?
headers
的值不是
None
,也不是dict,而是可编辑的。Iterable应该产生
(键,值)
对,但这不是它得到的。在我看来,崩溃发生在flask/werkzeug试图处理响应时。您可以在堆栈跟踪中看到,根本不涉及我的代码,顶部文件是
flask/app/py
。触发API调用的行是
r=requests.get(url,data=data,verify=False)
您可以共享您的视图代码吗?解析响应的标题会让人窒息,您的代码不在堆栈跟踪中,因为错误不在您的视图中是的,但这并不意味着它不是原因-它毕竟生成了响应。我不可能对此投足够的赞成票!你解决了一周的痛苦和挫折。
return r.text, r.status_code, r.headers
return r.text, r.status_code, r.headers.items()