So erhalten Sie Daten von ‘ImmutableMultiDict’ in der Flasche

Lesezeit: 4 Minuten

Benutzeravatar von Suraj Palwe
Suraj Palwe

Ich lerne, wie man Ajax und Flask verwendet, also sende ich eine Ajax-Anfrage und erhalte die Daten als post Anfrage in meiner Python-Datei

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

Dies gibt mir folgende Daten auf der Seite

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

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

Also wie bekomme ich die name Und age. Bitte korrigieren Sie mich, wenn ich irgendwo falsch liege. Vielen Dank im Voraus.

  • Verwenden request.json.get('name')

    – kartheek

    17. März 2015 um 4:44 Uhr

Benutzeravatar von Jason B
Jason B

Sie müssen nicht wirklich Daten von einem abrufen ImmutableMultiDict. Es gibt ein paar Fehler in dem, was Sie haben, die Sie daran hindern, die Antwort einfach als JSON-Daten abzurufen. Zunächst müssen Sie die Parameter Ihres Ajax-Aufrufs leicht anpassen. Sie sollten den Anruftyp als hinzufügen POST. Außerdem, datatype sollte so geschrieben werden dataType. Ihr neuer Anruf sollte lauten:

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 werden nun tatsächlich als Post-Request mit verschickt json Typ. Auf dem Flask-Server können wir die Daten nun wie folgt als Son-Informationen auslesen:

@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

Dies wird gedruckt John Doe Und 21 erfolgreich.

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

Bearbeiten: Sie können den Erfolg des Ajax-Aufrufs von Flask wie folgt zurückgeben:

# 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)

  • Diese Methode funktioniert gut error Funktion.

    – Suraj Palwe

    17. März 2015 um 5:24 Uhr

  • Was geben Sie von Ihrer Funktion zurück? Ich bringe Ihnen eine Lösung. Grundsätzlich, was soll die Funktion zurückgeben und was wollen Sie #clash anzeigen?

    – Jason B

    17. März 2015 um 5:28 Uhr


  • Okay, ich habe den Punkt. Ich sollte von meiner Funktion als einige Daten (Json) zu Ajax zurückkehren, damit es erfolgreich empfangen wird, sonst wäre es nur ein Fehler. Vielen Dank für Ihre freundliche Hilfe

    – Suraj Palwe

    17. März 2015 um 5:33 Uhr

  • Ja, ich habe gerade die richtige Vorgehensweise in der Antwort hinzugefügt.

    – Jason B

    17. März 2015 um 5:35 Uhr


  • Der Haken dabei ist, dass Sie immer angeben müssen contentType in Ajax-Anfrage abgesehen von dataType. stackoverflow.com/questions/14322984/…

    – darxtrix

    11. Dezember 2017 um 20:15 Uhr

Rufen Sie einfach to_dict für das Objekt „request.form“ auf. http://www.seanbehan.com/how-to-get-a-dict-from-flask-request-form/

  • das war die antwort die ich brauchte.

    – Prosti

    23. Januar 2020 um 21:23 Uhr


  • Wenn Sie Dateien hochladen, anstatt das Formular zu verwenden, ändern Sie es einfach in request.files.to_dict()

    – Mohab Khaled

    27. Juli 2022 um 16:24 Uhr

Ich bin auf diese Seite gekommen, weil ich versuche, ein Formular mit AJAX zu senden, und ich habe endlich eine Lösung gefunden. Und die Lösung besteht darin, JSON zu überspringen (ich hoffe, dies hilft anderen bei derselben Suche):

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

Dann auf dem Flask-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'

goodnews johns Benutzeravatar
gute nachrichten john

Ich habe das Problem gelöst, indem ich den contentType so als application/JSON hinzugefügt habe

data ={ 
              type:'POST',
              contentType:'application/json',
              otherData: 'foo'
           }

Sie können nun wie folgt auf die Daten im Flask-Backend zugreifen:

app.route('/my_url', methods = ["POST"])
def some_function():
    other_data = request.form['otherData']
    # do something

Hinweis: Ich habe dafür Vanille-JavaScript verwendet, nicht jQuery

Diese Arbeit für mich:

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

In der Kolben-App: improt json

@app.route('/my_url',methods=['POST,GET'])  # 
def some_function():
    dataList=list(request.form)[0] # output is string ==> '{"name":"John Doe","age":"21"}'
    b=json.loads(dataList) # output is dictionary ==> {"name":"John Doe","age":"21"}
    print(b) #{"name":"John Doe","age":"21"}

    return 'OK'

1442800cookie-checkSo erhalten Sie Daten von ‘ImmutableMultiDict’ in der Flasche

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy