2015-03-17 10 views
6

Ich lerne, wie Ajax verwenden und Flask, also was ich tue, ist ich eine Ajax-Anforderung senden und ich erhalte die Daten als post Anfrage in meiner Python-Dateiwie in Daten von ‚ImmutableMultiDict‘ erhalten Kolben

My html file contains this code

var data = {"name":"John Doe","age":"21"}; 
$.ajax({ 
    url:'/post/data', 
    datatype : "json", 
    contentType: "application/json; charset=utf-8", 
    data : JSON.stringify(data), 
    success : function(result) { 
    jQuery("#clash").html(result); 
    },error : function(result){ 
    console.log(result); 
} 
}); 

und meine python-Datei enthält:

@app.route('/post/data',methods=['GET','POST']) 
def postdata(): 
    #do some 
    data = str(request.args) 
    json_dumps = json.dumps(data) 
    return json_dumps 

das gibt mir Daten auf der Seite folgende

"ImmutableMultiDict([('{\"name\":\"John Doe\",\"age\":\"21\"}', u'')])" 

Und das ist, was mein request.query_string{%22name%22:%22John%20Doe%22,%22age%22:%2221%22}

sieht ja, wie bekomme ich die name und age. Bitte korrigieren Sie mich Wenn ich irgendwo falsch liege. Vielen Dank im Voraus.

+0

Verwenden Sie 'request.json.get ('Name')' – kartheek

Antwort

12

Sie müssen nicht wirklich Daten von einem ImmutableMultiDict erhalten. Es gibt ein paar Fehler in dem, was Sie daran hindern, die Antwort als JSON-Daten zu ziehen. Zuallererst müssen Sie die Parameter Ihres Ajax-Aufrufs etwas anpassen. Sie sollten den Anruftyp als POST hinzufügen. Außerdem sollte datatype als dataType geschrieben werden. Ihr neuer Anruf sollte sein:

var data = {"name":"John Doe","age":"21"}; 
$.ajax({ 
    type: 'POST', 
    contentType: 'application/json', 
    url: '/post/data', 
    dataType : 'json', 
    data : JSON.stringify(data), 
    success : function(result) { 
     jQuery("#clash").html(result); 
    },error : function(result){ 
     console.log(result); 
    } 
}); 

Die Daten nun tatsächlich als Post-Anforderung mit dem Typ json gesendet werden. Auf dem Kolben-Server können wir jetzt die Daten als Sohn Informationen wie folgt lauten:

@app.route('/post/data',methods=['GET','POST']) 
def postdata(): 
    jsonData = request.get_json() 
    print jsonData['name'] 
    print jsonData['age'] 
    return "hello world" #or whatever you want to return 

Diese John Doe und 21 erfolgreich gedruckt wird.

Lassen Sie mich wissen, ob dies für Sie funktioniert oder wenn Sie weitere Fragen haben!

Edit: Sie können den Erfolg der Ajax-Aufruf von Kolben zurück, wie folgt:

# include this import at the tomb 
from flask import jsonify 

@app.route('/post/data',methods=['GET','POST']) 
    def postdata(): 
     ... 
     return jsonify(success=True, data=jsonData) 
+0

Diese Methode funktioniert gut .. Daten erhalten in Python-Datei, wie ich brauchte, aber in AJAX kehrt es zu 'Fehler' -Funktion. –

+0

Was kommen Sie von Ihrer Funktion zurück? Ich werde dir eine Lösung bringen. Im Grunde, was soll die Funktion zurückgeben, und was soll "# clash" anzeigen? –

+0

Okay, ich habe den Punkt verstanden. Ich sollte von meiner Funktion als einige Daten (JSON) zu AJAX zurückkehren, so dass es bei Erfolg erhalten würde oder sonst wäre es nur ein Fehler. Danke für Ihre freundliche Hilfe –

4

ich auf diese Seite gekommen, weil ich versuche, ein Formular mit AJAX zu schicken, und ich fand schließlich eine Lösung. Und die Lösung ist JSON zu überspringen (hoffen, dass diese andere auf der gleichen Suche helfen):

$.ajax({ 
    type: "POST", 
    url: my_url, 
    data: $("#formID").serialize(), //form containing name and age 
    success: function(result){ 
     console.log(result); 
    } 
}); 

Dann wird auf der Flasche Server:

app.route('/my_url', methods = [POST]) 
def some_function(): 
    name = request.form['name'] 
    age = request.form['age'] 
    # do what you want with these variables 
    return 'You got it right'