2012-12-08 6 views
5

In HTML zurückgegebene Ausnahmen brechen meinen JSON-Client. Ich möchte diese Ausgabe jsonifizieren.API in Flask - gibt JSON zurück, aber HTML-Ausnahmen brechen meinen JSON-Client

Weitere details: ich habe eine View-Funktion, die ein Endpunkt dieser API app.

Wie Sie sehen können, gibt diese Funktion das Ergebnis in json zurück.

@app.route('/route1') 
def api_route1(): 
    if user_id in request.args: 
     k1 = request.args['user_id'] 
     return flask.jsonify(recs=some_function(k1)) 
    else: 
     return "no valid user_id supplied" 

Das Problem sind nicht behandelte Ausnahme in HTML, zum Beispiel

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 
    Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
    <head> 
     <title>TypeError: 'NoneType' object is not iterable // Werkzeug Debugger</title> 
     <link rel="stylesheet" 
      href="?__debugger__=yes&amp;cmd=resource&amp;f=style.css" 
      type="text/css"> 

Das bricht mir json-Client. Das HTML-Format ist eindeutig ein Standard, aber ich weiß nicht, wie ich es ablehnen und jsonified Ausnahmen angeben kann (und idealerweise jsonify alles zurückgegebene sogar Header).

Ich vermute, was ich brauche, ist irgendwo in der ausgezeichneten Flask-Dokumentation, aber ich kann es nicht finden.

+0

Sie versuchen also, die Fehlermeldungen zu erhalten und sie als JSON zu senden, falls etwas schief geht? – Blender

+0

@Blender, ja, das ist was ich will. – doug

Antwort

4

Wenn Sie dem JSON-Client das Traceback zur Verfügung stellen, können vertrauliche Informationen offengelegt werden.

Mein Rat ist:

  • wiederum Debug-off
  • ein Log-Aggregation-Tool wie sentry
  • die Fehler 500 Seiten für diese Anwendung make install gibt einen allgemeinen Fehler im JSON-Format

Die 500 Seite könnte wie folgt aussehen:

{ "error": "500 - internal server error" } 
+0

Das sollte das OP tun. – sberry

1

Der folgende Code sollte den Zweck erfüllen. Die Idee besteht also darin, alle eventuell aufgetretenen Exceptions abzufangen, die Exception-Details mit dem Trace-Back-Modul als String zu formatieren und dann als gültiges json zurückzugeben. Ich würde empfehlen, eine Reihe von Ausnahmeanweisungen mit den Haupttypen von Fehlern, die Sie erwarten, und eine besser lesbare Fehlermeldung zu setzen. Dann können Sie eine letzte Ausnahme als einen Haken haben, falls etwas Seltsames und Unerwartetes passiert.

import traceback 

@app.route('/route1') 
def api_route1(): 
    if user_id in request.args: 
     try: 
      k1 = request.args['user_id'] 
      return flask.jsonify(recs=some_function(k1)) 
     except: 
      return flask.jsonify(exception=traceback.format_exc()) 
    else: 
     return flask.jsonify(exception="no valid user_id supplied") 
+0

selbst der else-Teil kann jsonify haben, dies wird wiederum HTML zurückgeben, wenn user_id nicht in Argumenten ist. – Codeanu

+0

@Codeanu guten Vorschlag, ich aktualisierte die Antwort mit dem, was Sie vorgeschlagen. –

6

Sie sollten HTTP definieren error handlers in flask.

Eine einfache JSON 404 Handler returing etwas könnte wie folgt aussehen:

@app.errorhandler(404) 
def page_not_found(e): 
    return flask.jsonify(error=404, text=str(e)), 404 

Damit Sie data.error auf dem Client zu überprüfen, in der Lage, und wenn es Sie existiert kann den Fehlertext mit data.text erhalten (der Fehler e ist werkzeug.exceptions.NotFound, dessen String-Darstellung "404: Not Found" lautet).

Verwandte Themen