2016-07-29 1 views
3

Wie könnte man Ausnahmen global mit Flask behandeln? Ich habe Wege gefunden, die folgenden verwenden, um benutzerdefinierte db Interaktionen zu behandeln:Flask globale Ausnahmebehandlung

try: 
    sess.add(cat2) 
    sess.commit() 
except sqlalchemy.exc.IntegrityError, exc: 
    reason = exc.message 
    if reason.endswith('is not unique'): 
     print "%s already exists" % exc.params[0] 
     sess.rollback() 

Das Problem mit try-except ist ich muss, dass auf jedem Aspekt meines Code ausführen würde. Ich kann bessere Möglichkeiten finden, das für benutzerdefinierten Code zu tun. Meine Frage richtet sich mehr auf globale Fang- und Handling für:

apimanager.create_api(
    Model, 
    collection_name="models", 
    **base_writable_api_settings 
) 

ich gefunden habe, dass diese apimanager akzeptiert validation_exceptions: [ValidationError], aber ich habe keine Beispiele dafür verwendet werden, gefunden.

Ich möchte immer noch eine höhere Stufe der Behandlung, die Auswirkungen auf alle Db-Interaktionen mit einem einfachen Konzept von "Wenn dieser Fehler: dies zeigen, wenn ein anderer Fehler: etwas anderes anzeigen" automatisch auf alle Interaktionen/Ausnahmen automatisch ohne mich einschließlich es auf jeder apimanager (setzen es in meine base_writable_api_settings ist in Ordnung, denke ich). (IntegrityError, NameError, DataError, DatabaseError usw.)

Antwort

1

I neigen dazu, eine Fehlerbehandlung auf dem App einzurichten, der die Ausnahme in ein json Antwortformate. Dann können Sie benutzerdefinierte Ausnahmen wie UnauthorizedException ...

class Unauthorized(Exception): 
    status_code = 401 

@app.errorhandler(Exception) 
def _(error): 

    trace = traceback.format_exc() 
    status_code = getattr(error, 'status_code', 400) 
    response_dict = dict(getattr(error, 'payload', None) or()) 
    response_dict['message'] = getattr(error, 'message', None) 
    response_dict['traceback'] = trace 

    response = jsonify(response_dict) 
    response.status_code = status_code 
    traceback.print_exc(file=sys.stdout) 
    return response 

Sie erstellen auch spezifische Ausnahmen mit diesem Muster behandeln ...

@app.errorhandler(ValidationError) 
def handle_validation_error(error): 
    # Do something... 

Fehlerbehandlungsroutinen für die App erhalten angebracht, nicht die apimanager . Sie haben wahrscheinlich etwas wie

app = Flask() 
apimanager = ApiManager(app) 
... 

Setzen Sie diese irgendwo mit diesem App-Objekt.

+0

[Hier] (http://flask.pooco.org/docs/0.11/api/#flask.Flask.errorhandler) ist die relevante Dokumentation! –

+0

Könnten Sie mir bitte sagen, wie dies zu verbinden: apimanager.create_api ( Modell, collection_name = „Modelle“, ** base_writable_api_settings) Derzeit ist mein Ziel für eine benutzerdefinierte Nachricht zu erhalten: IntegrityError. Das gilt für alle api_manager. 'Code base_api_settings = { "exclude_columns": [ 'Passwort', 'user.password', 'Gruppen', 'registration_token',‚Benutzer.registration_token '], "max_results_per_page": 100, "validation_exceptions": [ValidationError] } ' – draxous

+0

Ich habe diese verschiedenen Möglichkeiten ausprobiert. Jedes Mal, wenn ich einen doppelten Eintrag einreichen erhalte ich den Standard: { "message": "IntegrityError" } Hier ist ein Pastebin: http://pastebin.com/7Asb08kE – draxous

0

Mein bevorzugter Ansatz verwendet decorated View-Funktionen.

Sie einen Dekorateur wie folgt definieren könnte:

def handle_exceptions(func): 
    @wraps(func) 
    def wrapper(*args, **kwargs): 
    try: 
     return func(*args, **kwargs) 
    except ValidationError: 
     # do something 
    except HTTPException: 
     # do something else ... 
    except MyCustomException: 
     # do a third thing 

Dann können Sie einfach dekorieren Sie Ihre Ansicht-Funktionen, zum Beispiel

Ich weiß leider nicht über die Haken Flask-Restless bietet für vorbeifahrende Funktionen.