cómo obtener datos de ‘ImmutableMultiDict’ en el matraz

4 minutos de lectura

Avatar de usuario de Suraj Palwe
Suraj Palwe

Estoy aprendiendo a usar ajax y Flask, así que lo que hago es enviar una solicitud de ajax y recibo los datos como post solicitud en mi archivo 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);
 }
});

Y mi archivo python contiene:

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

Esto me da los siguientes datos en la página.

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

Y esto es lo que mi request.query_string aspecto {%22name%22:%22John%20Doe%22,%22age%22:%2221%22}

Entonces, ¿cómo obtengo el name y age. Por favor, corríjame si me equivoco en alguna parte. Gracias de antemano.

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

    – kartheek

    17 de marzo de 2015 a las 4:44

Avatar de usuario de Jason B
jason b

En realidad, no necesita obtener datos de un ImmutableMultiDict. Hay un par de errores en lo que tiene que le impiden obtener la respuesta como datos json. En primer lugar, debe modificar ligeramente los parámetros de su llamada ajax. Debe agregar el tipo de llamada como POST. Es más, datatype debe escribirse como dataType. Su nueva llamada debe ser:

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

Los datos ahora se envían como una solicitud posterior con el json escribe. En el servidor Flask, ahora podemos leer los datos como información secundaria de la siguiente manera:

@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

Esto se imprimirá John Doe y 21 exitosamente.

¡Avíseme si esto funciona para usted o si tiene alguna pregunta adicional!

Editar: puede devolver el éxito a la llamada ajax desde el matraz de la siguiente manera:

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

  • Este método funciona bien … los datos se reciben en el archivo python como lo necesitaba, pero en ajax vuelve a error función.

    – Suraj Palwe

    17 de marzo de 2015 a las 5:24

  • ¿Qué estás volviendo de tu función? Te daré una solución. Básicamente, ¿qué quieres que devuelva la función y qué quieres #clash para mostrar?

    – Jason B.

    17 de marzo de 2015 a las 5:28


  • Bien, entendí el punto. Debería regresar de mi función como algunos datos (Json) a ajax para que se reciba con éxito o, de lo contrario, solo sería un error. Gracias por su amable ayuda.

    – Suraj Palwe

    17 de marzo de 2015 a las 5:33

  • Sí, acabo de agregar la forma correcta de hacerlo en la respuesta.

    – Jason B.

    17 de marzo de 2015 a las 5:35


  • El problema aquí es que siempre debe especificar contentType en solicitud ajax aparte de dataType. stackoverflow.com/questions/14322984/…

    – darxtrix

    11 dic 2017 a las 20:15

Simplemente llame a to_dict en el objeto request.form Por ejemplo, http://www.seanbehan.com/how-to-get-a-dict-from-flask-request-form/

  • esta era la respuesta que necesitaba.

    – prosti

    23 de enero de 2020 a las 21:23


  • si está cargando archivos en lugar de usar el formulario, simplemente cámbielo a request.files.to_dict()

    – Mohab Jaled

    27 de julio de 2022 a las 16:24

Vine a esta página porque estoy tratando de enviar un formulario con AJAX y finalmente encontré una solución. Y la solución es omitir JSON (espero que esto ayude a otros en la misma búsqueda):

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

Luego, en el servidor 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'

buenas noticias avatar de usuario de john
buenas noticias juan

Resolví el problema agregando contentType como application/JSON así

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

Ahora puede acceder a los datos en el backend del matraz de la siguiente manera:

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

Nota: utilicé JavaScript vainilla para esto, no jQuery

Este trabajo para mí:

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

En la aplicación del matraz: 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'

¿Ha sido útil esta solución?