2013-05-23 7 views
5

अनपैक करने के लिए बहुत सारे मान हैं मेरे पास एक फ्लास्क ऐप है जो किसी अन्य वेब सेवा के साथ संचार करता है। मेरे पास यह त्रुटि है जो केवल तब होती है जब दोनों अनुप्रयोग एक ही सर्वर पर चल रहे हैं, लेकिन मुझे नहीं पता कि स्रोत क्या है। फ्लास्क एप्लिकेशन को /tools पर अपाचे में WSGIScriptAlias के माध्यम से होस्ट किया गया है।ValueError के साथ फ्लास्क क्रैश:

[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 कॉल निम्नलिखित कार्यों में किया जाता है:

@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 

जो कहता है:

def call_api(method, endpoint, data=None, files=None): 
    url = 'https://api.example.com' + endpoint 
    if method.upper() == "GET": 
     r = requests.get(url, data=data, verify=False) 
    # ... similarly for other verbs 
    return r.text, r.status_code, r.headers 
+1

से आप अपने ध्यान में रखते हुए हेडर स्थापित करने के लिए कोशिश कर रहे हैं? क्या आप कोड साझा कर सकते हैं? 'हेडर' का मान 'कोई नहीं' नहीं है, और यह एक नियम नहीं है, लेकिन यह पुन: प्रयोज्य है। Iterable ''(कुंजी, मूल्य)' जोड़े पैदा करना चाहिए, लेकिन यह नहीं है कि यह क्या हो रहा है। – DazWorrall

+0

ऐसा लगता है कि क्रैश तब होता है जब फ्लास्क/वेर्कजेग प्रतिक्रिया को संसाधित करने का प्रयास कर रहा है। आप स्टैक ट्रेस में देख सकते हैं कि मेरा कोड बिल्कुल शामिल नहीं है, शीर्ष फ़ाइल 'फ्लास्क/ऐप/पीई' है। एपीआई कॉल ट्रिगर करने वाली रेखा 'r = request.get (url, data = data, verify = गलत)' – Baruch

+0

क्या आप अपना व्यू कोड साझा कर सकते हैं? प्रतिक्रिया के शीर्षकों को पार्स करने का यह चौंकाने वाला, आपका कोड स्टैक ट्रेस में नहीं है क्योंकि त्रुटि आपके दृश्य में नहीं है, लेकिन इसका मतलब यह नहीं है कि यह कारण नहीं है - यह सब के बाद प्रतिक्रिया उत्पन्न करता है। – DazWorrall

उत्तर

10

मेरे सबसे अच्छा अनुमान है कि आप एक विशेष हेडर शब्दकोश (अजगर-अनुरोधों से) लौटने के बजाय है एक सामान्य एक। कुप्पी दो रूपों में हेडर लेता है:

{'key': 'value'} 
# and 
[('key', 'value')] 

के बाद से अपने विशेष dict कोई वास्तविक dict रूप में मान्यता प्राप्त नहीं है, यह tuples की एक सूची है, जो विफल रहता है की तरह व्यवहार किया जाएगा।

बदलें

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

return r.text, r.status_code, r.headers.items() 
+1

मैं संभवतः इसे पर्याप्त वोट नहीं दे सकता! आपने दर्द और निराशा के एक हफ्ते का हल किया। – Baruch

संबंधित मुद्दे