как получить данные из 'ImmutableMultiDict' в колбе

Я учусь использовать ajax и флягу, поэтому я отправляю запрос ajax, и я получаю данные как post запрос в моем файле 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);
 }
});

и мой файл python содержит:

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

это дает мне следующие данные на странице

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

и это то, что мой request.query_string выглядит {%22name%22:%22John%20Doe%22,%22age%22:%2221%22}

так как name и age. Пожалуйста, поправьте меня, если я ошибаюсь.Спасибо заранее.

3 ответов


вам на самом деле не нужно получать данные от ImmutableMultiDict. Есть несколько ошибок в том, что у вас есть, которые мешают вам просто вытащить ответ как данные json. Во-первых, вам нужно немного настроить параметры вашего вызова ajax. Вы должны добавить в тип вызова как POST. Более того,datatype должно быть записано как dataType. Ваш новый звонок должен быть:

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

данные теперь фактически отправляются как запрос post с json тип. На колбе сервер, Теперь мы можем читать данные как информацию о сыне следующим образом:

@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

выводит John Doe и 21 успешно.

Дайте мне знать, если это работает для вас или если у вас возникли дополнительные вопросы!

Edit: вы можете вернуть успех вызову ajax из колбы следующим образом:

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

Я пришел на эту страницу, потому что я пытаюсь отправить форму с AJAX, и я, наконец, нашел решение. И решение состоит в том, чтобы пропустить JSON (надеюсь, это поможет другим в том же поиске):

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

затем на сервере колбы:

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'

просто вызовите to_dict по запросу.форма объекта, например, http://www.seanbehan.com/how-to-get-a-dict-from-flask-request-form/