Подтвердить что ты не робот

Как я могу использовать данные, отправленные из ajax в колбе?

У меня возникли проблемы с получением данных POSTed из jquery 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, например

{
    '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)

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

4b9b3361

Ответ 1

Попробуйте

 $.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

Ответ 2

В соответствии с вашим примером вы не отправляете пару значений ключа, а назначаете строку 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']
     )

Ответ 3

Вы пытались удалить contentType? Предположим, что вы отправляете данные в Flask.

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

data: { "hello": "world" } внутри ajax? просто чтобы проверить, пришел ли мир привет, чтобы request.form