2016-12-24 4 views
1

Ich habe auf Stapelüberlauf gründlich gesucht und google über diesen Fehler und ich konnte die Lösung nicht finden, die meine Situation löst.Flask Json json.decoder.JSONDecodeError: Erwartungswert: Zeile 1 Spalte 1 (char 0)

Ich benutze Marshmallow, um meine API-Anfrage zu serialisieren/deserialisieren.

@post_user_blueprint.route('/api/v1/get_current_profile', methods=['GET']) 
@login_required 
def get_profile(): 
    query_user_by_order = User.query.join(Sample) \ 
     .join(Individual) \ 
     .join(Ordering) \ 
     .join(Family) \ 
     .join(Sequence) \ 
     .filter(User.id == Sample.fk_user_id) \ 
     .filter(Individual.id == Sample.fk_individual_id) \ 
     .filter(Sample.id == Sequence.fk_sample_id) \ 
     .filter(Individual.id == Ordering.fk_individual_id) \ 
     .filter(Family.id == Individual.fk_family_id) \ 
     .filter(User.email == current_user.email)\ *********** 
     .all() 

    result = profile_users_schema.dump(query_user_by_order) 
    return jsonify({'user': result.data}) 


@login_required 
@post_user_blueprint.route('/profile', methods=['GET', 'POST']) 
def profile(): 
    response = requests.get('http://127.0.0.1:5000/api/v1/get_current_profile') 
    response = response.text 
    data = json.loads(response) $$$$$$$$$$$$$$$$$ 
    return render_template('profile.html', user_object = data) 

*****: wenn ich diese Zeile weglassen, das funktioniert gut, ist der einzige Grund, dass ich diese Linie bin Zugabe ist zu zeigen, wer in sein/ihr Profil Profil anstatt zu zeigen, jeder protokolliert. $$$$$: Dies ist die Fehlerlinie.

Volltraceback

File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/flask/app.py", line 2000, in __call__ 
return self.wsgi_app(environ, start_response) 
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/flask/app.py", line 1991, in wsgi_app 
response = self.make_response(self.handle_exception(e)) 
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/flask_restful/__init__.py", line 271, in error_router 
return original_handler(e) 
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/flask/app.py", line 1567, in handle_exception 
reraise(exc_type, exc_value, tb) 
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/flask/_compat.py", line 33, in reraise 
raise value 
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/flask/app.py", line 1988, in wsgi_app 
response = self.full_dispatch_request() 
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/flask/app.py", line 1641, in full_dispatch_request 
rv = self.handle_user_exception(e) 
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/flask_restful/__init__.py", line 271, in error_router 
return original_handler(e) 
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/flask/app.py", line 1544, in handle_user_exception 
reraise(exc_type, exc_value, tb) 
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/flask/_compat.py", line 33, in reraise 
raise value 
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/flask/app.py", line 1639, in full_dispatch_request 
rv = self.dispatch_request() 
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/flask/app.py", line 1625, in dispatch_request 
return self.view_functions[rule.endpoint](**req.view_args) 
File "/Users/genomics/PycharmProjects/sample_accessioning/app/views/post_inputs.py", line 209, in profile 
profile = response.json() 
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/requests/models.py", line 826, in json 
return complexjson.loads(self.text, **kwargs) 
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/__init__.py", line 319, in loads 
return _default_decoder.decode(s) 
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/decoder.py", line 339, in decode 
obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/decoder.py", line 357, in raw_decode 
raise JSONDecodeError("Expecting value", s, err.value) from None 
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) 

Ich verstehe nicht, warum dies geschieht, die ****** Linie nicht direkt zeigt seine Fehler, nachdem ich rechts oben def get_profile @login_required bringen. Aber wenn die @login_required nicht da war, es warf

AttributeError: 'AnonymousUser' object has no attribute 'email' 

Wenn möglich, möchte ich eine Möglichkeit wissen, der aktuelle Benutzer die E-Mail bekommen, so kann ich anstelle von ganzen aktuellen Benutzer-Profile abfragen. Außerdem möchte ich wirklich wissen, warum unten ein Fehler auftritt.

json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) 

Danke,

Antwort

1

Ok, damit ich die Lösung gefunden, ich gebe alle meine Kredit AArias , da er einen saubereren Weg vorgeschlagen hat, die Antwortdaten zu bekommen. Da HTTP Bytes und nicht Strings zurückgibt, müssen Sie es explizit in utf-8 decodieren, und viele der existierenden Synthax funktionieren nicht. Ich weiß nicht warum. Der folgende Code funktioniert.

response = get_profile().data 
data = json.loads(response.decode('utf-8')) 

Wenn jemand versuchen, es mit .lesen zu dekodieren() oder .readall(), wäre es nicht funktionieren, weil die Antwort Objekt nicht gelesen hat oder ReadAll Methode. Der beste Weg ist der einfachste Weg, entschlüsseln Sie ihn einfach und verwenden Sie "Lasten", nicht "Laden". Hoffe, es hilft jemandem

+0

Froh, dass Sie die Antwort gefunden haben. Tatsächlich gibt es eine bessere Möglichkeit, die Antwort als Unicode-String zu erhalten, ohne die 'decode'-Methode für die Antwort zu verwenden. Verwenden Sie einfach die 'get_data()' Methode. Das "Daten" -Attribut wird letztendlich, wie hier beschrieben, veraltet sein: http://flask.pocoo.org/docs/0.12/api/#flask.Response.Daten Tut mir leid, mein Schlechter. Sie sollten '.data' in' .get_data (as_text = True) 'ändern und dann sollten Sie' .decode ('utf-8') 'vermeiden können. Ich habe meine Antwort aktualisiert, um dies zu reflektieren, lass es mich wissen, wenn es funktioniert! – AArias

+0

Warum meine Antwort nicht akzeptieren, wenn sie noch 9 Monate später gültig ist und Ihr Problem tatsächlich gelöst wurde? Nicht cool, da ich mir die Zeit genommen habe, dir zu helfen. – AArias

1

Dies ist, was ich denke, geschieht:

Sie sind mit dem @login_required Dekorateur eine Anfrage an Ihren eigenen Server zu einem Endpunkt zu machen (ich nehme an, Sie Kolben verwenden -login oder ähnliches). Dadurch wird eine andere Sitzung erstellt, in der der aktuelle Benutzer, für den Sie angemeldet sind, nicht authentifiziert ist (Sie erhalten wahrscheinlich eine 401-Antwort, die nicht autorisiert ist).

Wenn Sie die Antwort von einem anderen Endpunkt möchten, ohne den aktuell authentifizierten Benutzer zu verlieren, können Sie so etwas wie dies versuchen:

@login_required 
@post_user_blueprint.route('/profile', methods=['GET', 'POST']) 
def profile(): 
    response = get_profile().get_data(as_text=True) 
    data = json.loads(response) 
    return render_template('profile.html', user_object = data) 
+0

@ AArias: Ich bekomme "TypeError: das JSON-Objekt muss str sein, nicht 'Bytes'", da HTTP-Antwort Bytes nicht Zeichenfolgen zurückgibt, habe ich versucht, es mit dieser Stackoverflow-Antwort http: // dekodieren stackoverflow.com/questions/6862770/python-3-let-json-object-accept-bytes-or-let-urlopen-output-strings, aber es wirft immer noch einen gleichen Fehler – Jessi

+0

Antwort aktualisiert! – AArias

+0

Ihre aktualisierte Lösung funktioniert perfekt. Schön und sauber, danke – Jessi

Verwandte Themen