2013-05-23 17 views
5

Mam aplikację kolby, która komunikuje się z inną usługą sieciową. Mam ten błąd, który zdaje się występować tylko wtedy, gdy obie aplikacje działają na tym samym serwerze, ale nie wiem, jakie jest źródło. Aplikacja Flask jest hostowana pod numerem /tools za pośrednictwem WSGIScriptAlias w Apache.Flask ulega awarii z ValueError: zbyt wiele wartości do rozpakowania

[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 

Interfejs API jest hostowany w innej domenie na tym samym komputerze, patrząc na plik dziennika, który działa, działa poprawnie.

Wywołanie API składa się z następujących funkcji:

@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 

który wzywa:

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

Próbujesz ustawić nagłówki w widoku? Czy mógłbyś udostępnić kod? Wartość 'headers' nie jest' None' i nie jest dict, ale jest iterable. Iterable powinien dawać '' parę (klucz, wartość) ', ale to nie jest to, co dostaje. – DazWorrall

+0

Wydaje mi się, że katastrofa występuje, gdy flask/werkzeug próbuje przetworzyć odpowiedź. W śladzie stosu widać, że mój kod nie jest w ogóle zaangażowany, górny plik to 'flask/app/py'. Linia wyzwalaczy wywołania API to 'r = requests.get (url, data = data, verify = False)' – Baruch

+0

Czy możesz udostępnić swój kod widoku? Jego dławiki analizują nagłówki odpowiedzi, twój kod nie znajduje się na wykresie stosu, ponieważ błąd nie jest w twoim widoku tak, ale to nie znaczy, że nie jest przyczyną - w końcu generuje odpowiedź. – DazWorrall

Odpowiedz

10

Mój najlepszy przypuszczenie to, że wrócisz specjalnego słownika nagłówki (od Pythona wniosków) zamiast normalny. Kolba zajmuje nagłówki w dwóch formach:

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

Ponieważ specjalny DICT nie jest rozpoznawana jako prawdziwy dict, będzie ona traktowana jak listą krotek, która kończy się niepowodzeniem.

Zmień

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

do

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

Nie mogę tego podwyższyć! Rozwiązałeś tydzień bólu i frustracji. – Baruch

Powiązane problemy