2015-12-26 13 views
6

(Das ist wahrscheinlich eine dumme Frage, also trage bitte deine Dummheitsschilde!) Ich war PHP-Programmierer und lerne jetzt Python + Flask. Ich musste mich in letzter Zeit mit der Veröffentlichung von Daten durch AJAX und der Rückgabe einer Antwort schwer tun. Schließlich, dass der Code arbeitete, war:Warum ist json.dumps() ein Muss in Flask?

@app.route('/save', methods=['POST']) 
def save_subscriptions(): 
    if request.method == 'POST': 
     sites = request.form.get('selected') 
     print(sites) 
     sites = sites[0:-1]   
     g.cursor.execute('UPDATE users SET sites = %s WHERE email = %s', [sites, session.get('email')]) 
     g.db.commit() 
     return json.dumps({'status': 'success'}) 

Wenn ich return json.dumps({'status': 'success'}) zu return 1 ich eine Ausnahme erhalten ändern, dass int is not callable. Zuallererst verstehe ich nicht, wer versucht, das int zu nennen und warum? Zweitens, in PHP war es oft möglich, nur echo 1; und dies würde die AJAX-Antwort werden. Warum funktioniert return 1 nicht in Flask?

+2

Bitte sanieren Sie Ihre SQL-Abfragen! –

+0

@WillSherwood Danke! Ich habe mich gestern gefragt, was PHP vorbereiteten Aussagen entspricht, aber ich habe nicht viel darüber nachgedacht, da es ein persönliches Projekt ist. Ich werde das pronto ändern! – dotslash

+0

@WillSherwood Hey, warte mal! Ich schaue auf http://bobby-tables.com/python.html und frage mich, ob meine Abfragen nicht bereits bereinigt sind. Was muss ich noch tun? – dotslash

Antwort

7

Die Logik hinter dem, was sollte von Kolben zurückgeführt wurden Ansichten is described in the docs im Detail:

Der Rückgabewert aus einer Sicht-Funktion wird automatisch umgewandelt in ein Antwortobjekt für Sie. Wenn der Rückgabewert eine Zeichenfolge ist, wird sie in ein Antwortobjekt mit der Zeichenfolge response body, 200 OK-Fehlercode und einem text/html-MIME-Typ konvertiert. Die Logik, die Flask gilt Rückgabewerte in Antwort Objekte zu konvertieren ist als folgt:

  • Wenn ein Antwortobjekt des richtigen Typs zurückgegeben es ist direkt aus der Sicht zurückgegeben.

  • Wenn es sich um eine Zeichenfolge handelt, wird ein Antwortobjekt mit diesen Daten und den Standardparametern erstellt.

  • Wenn ein Tupel zurückgegeben wird, können die Elemente im Tupel zusätzliche Informationen liefern. Solche Tupel müssen in der Form (Antwort, Status, Header) sein, wo mindestens ein Element im Tupel sein muss. Der Statuswert überschreibt den Statuscode, und Header können eine Liste oder ein Verzeichnis zusätzlicher Headerwerte sein.

  • Wenn nichts davon funktioniert, Glaskolben wird der Rückgabewert ist eine gültige WSGI Anwendung übernehmen und umwandeln, die in ein Antwortobjekt.

In Ihrem Fall integer 1 zurückgegeben - Flask gilt die letzte Regel und versucht, sie in ein Antwortobjekt zu konvertieren und schlägt fehl. die im Fall einer ganze Zahl, nennen würde force_type() method eine werkzeug.Response Klasse, die schließlich eine Instanz fail Schaffung würde eine BaseResponse Klasse Intern wird make_response() method aufgerufen, wenn versucht, eine WSGI App zu instanziiert:

app_rv = app(environ, start_response) 

wo app in Ihrem Der Fall ist eine Ganzzahl 1.

+0

Ah, dumme ich! Also musste ich nur "1" zurückgeben. Vielen Dank! Wird dies als meine Antwort akzeptieren, sobald die Seite es mir erlaubt. – dotslash

+0

Und danke für die vollständige Erklärung. Lässt mich Web-Frameworks in einem ganz anderen Licht sehen. :-) – dotslash

Verwandte Themen