web-dev-qa-db-fra.com

comment obtenir les données de 'ImmutableMultiDict' en fiole

J'apprends à utiliser ajax et Flask. J'envoie donc une requête ajax et je reçois les données sous la forme d'une requête post dans mon fichier python.

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);
 }
});

Et mon fichier python contient:

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

Cela me donne les données suivantes sur la page

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

Et voici à quoi ressemble mon request.query_string{%22name%22:%22John%20Doe%22,%22age%22:%2221%22}

Alors, comment puis-je obtenir les name et age. S'il vous plaît, corrigez-moi si je me trompe n'importe où. Merci d'avance. 

8
Suraj Palwe

En réalité, vous n’avez pas besoin d’obtenir des données d’une variable ImmutableMultiDict. Il existe quelques erreurs dans votre travail qui vous empêchent de simplement extraire la réponse sous forme de données JSON. Tout d'abord, vous devez légèrement modifier les paramètres de votre appel ajax. Vous devez ajouter le type d’appel en tant que POST. De plus, datatype devrait être orthographié dataType. Votre nouvel appel devrait être:

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);
    }
});

Les données sont maintenant effectivement envoyées sous forme de demande de publication avec le type json. Sur le serveur Flask, nous pouvons maintenant lire les données sous forme d’informations sonores comme suit: 

@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

Ceci imprimera John Doe et 21 avec succès.

Faites-moi savoir si cela fonctionne pour vous ou si vous avez des questions supplémentaires!

Edit: Vous pouvez renvoyer l'appel à un appel ajax depuis flask comme suit:

# 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)
17
Jason Brooks

Je suis venu sur cette page parce que j'essaie d'envoyer un formulaire avec AJAX et j'ai finalement trouvé une solution. Et la solution consiste à ignorer JSON (j'espère que cela aidera les autres utilisateurs à effectuer la même recherche):

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

Ensuite, sur le serveur Flask:

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'
5
Magnus Tvedt

Appelez simplement to_dict sur l'objet request.form, par exemple, http://www.seanbehan.com/how-to-get-a-dict-from-flask-request-form/

2
seanbehan