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.
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 dedataType
. 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 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'
Utilizar
request.json.get('name')
– kartheek
17 de marzo de 2015 a las 4:44