2013-02-16 4 views
51

У меня возникли проблемы с получением данных POSTed из jquery ajax.как я могу использовать данные, отправленные из ajax в колбе?

$('#clickme').click(function() { 
    var data = save_input(); // data 

    data['_sid'] = $survey_id; // survey_id injected from flask 
    data['_uip'] = $user_ip; // user_ip injected from flask, request.remote_addr 

    $.ajax({ 
     type : "POST", 
     url : "{{ url_for('mod.load_ajax') }}", 
     data: JSON.stringify(data), 
     contentType: 'application/json;charset=UTF-8', 
     success: function(result) { 
      console.log(result); 
     } 
    }); 

    console.log(data); 
}); 

из кода, data является JavaScript Object как

{ 
    'foo' : 'foo', 
    'bar' : 'bar', 
    'fo_' : 42, 
} 

, что я пытаюсь сделать в колбе:

@mod.route('/load_ajax', methods=["GET", "POST"]) 
def load_ajax(): 
    if request.method == "POST": 
     # load _sid and _uip from posted JSON and save other data 
     # but request.form is empty. 
     # >>> request.form 
     # ImmutableMultiDict([]) 
     return str(request.form) 

см, запрос Аякса сделан, но данные не представлены. Я делаю console.log(data) с ajax, поэтому я вижу, что у меня действительно есть значимые данные в переменной data в jquery. но request.form в ajax-представлении пуст. Где представлены мои данные?

+0

Измените 'JSON.stringify (data)' на 'data' и посмотрите, что произойдет. – Blender

+0

@Blender Получаю данные. Как я могу получить это в формате JSON? – thkang

+0

Вы пробовали 'request.json'? – Blender

ответ

52

Попробуйте

$.ajax({ 
    type : "POST", 
    url : "{{ url_for('mod.load_ajax') }}", 
    data: JSON.stringify(data, null, '\t'), 
    contentType: 'application/json;charset=UTF-8', 
    success: function(result) { 
     console.log(result); 
    } 
}); 

Тогда с сервера, вы можете обратиться к переменным в данных, как это:

request.json['foo'] 

Поскольку содержание тип указан как application/json данные указаны в request.json

+3

это правильный способ сделать это - JSON.stringify. – thkang

+3

'stringify' и' contentType' сделали эту работу, спасибо – Acute

+0

thisi полезен – Sinux

10

В соответствии с вашим примером вы не отправляете пару значений ключа, а назначаете строку JSON для параметра данных jQuery. Как уже упоминалось в комментариях, вы должны подкрепить свой JSON, создать объект с ключом (который будет использоваться для доступа к строке JSON из фляжки), а затем назначить его ключу данных jQuery.

$.ajax({ 
      type : "POST", 
      url : "{{ url_for('mod.load_ajax') }}", 
      data: {json_str: JSON.stringify(data)}, 
      contentType: 'application/json;charset=UTF-8', 
      success: function(result) { 
       console.log(result); 
      } 
     }); 

    @mod.route('/load_ajax', methods=["GET", "POST"]) 
    def load_ajax(): 
     if request.method == "POST": 
      # load _sid and _uip from posted JSON and save other data 
      # but request.form is empty. 
      # >>> request.form 
      # ImmutableMultiDict([]) 
      return str(request.form['json_str'] 
    ) 
1

Вы попробовали удалить contentType? Вы можете отправить данные в Flask.

могли бы вы попробовать добавить поддельные данные, такие как

данных: { "привет": "мир"} внутри AJAX? просто проверить, если привет мир прибудет в Request.Form

Смежные вопросы