Как я могу передать словарь из JavaScript в колбу? - PullRequest
0 голосов
/ 29 октября 2018

Я хочу передать словарь (button_state) из javascript в python, используя flask и jquery. Что касается JQuery, у меня есть:

$(".btn#submit").click(function(event){
    newdata = JSON.stringify(buttons_state);
    console.log("submission button POST attempt: " + newdata)

    $.ajax({
        url: '/submission',
        dataType: 'json',
        type: 'post',
        contentType: 'application/json',
        data: newdata,
        processData: false,
        success: function(response){
            console.log(response);
        },
        error: function(error){
            console.log(error);
        }
    });

});

На стороне сервера:

@app.route('/submission', methods=['POST'])
def submission():
    info = request.get_json(silent=False)
    return info

Но я получаю сообщение об ошибке 500:

Traceback (most recent call last):
  File "/Users/timrand/anaconda3/lib/python3.7/site- 
packages/flask/app.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()
  File "/Users/timrand/anaconda3/lib/python3.7/site- 
packages/flask/app.py", line 1816, in full_dispatch_request
    return self.finalize_request(rv)
  File "/Users/timrand/anaconda3/lib/python3.7/site- 
packages/flask/app.py", line 1831, in finalize_request
    response = self.make_response(rv)
  File "/Users/timrand/anaconda3/lib/python3.7/site- 
packages/flask/app.py", line 1982, in make_response
    reraise(TypeError, new_error, sys.exc_info()[2])
  File "/Users/timrand/anaconda3/lib/python3.7/site- 
packages/flask/_compat.py", line 34, in reraise
    raise value.with_traceback(tb)
  File "/Users/timrand/anaconda3/lib/python3.7/site- 
packages/flask/app.py", line 1974, in make_response
rv = self.response_class.force_type(rv, request.environ)
  File "/Users/timrand/anaconda3/lib/python3.7/site- 
packages/werkzeug/wrappers.py", line 921, in force_type
response = BaseResponse(*_run_wsgi_app(response, environ))
  File "/Users/timrand/anaconda3/lib/python3.7/site- 
packages/werkzeug/test.py", line 923, in run_wsgi_app
    app_rv = app(environ, start_response)
TypeError: 'dict' object is not callable

Функция просмотра не вернула правильный ответ. Тип возвращаемого значения должен быть строкой, кортежем, экземпляром Response или вызываемым WSGI, но это был диктат. 127.0.0.1 - - [29 / Oct / 2018 07:53:48] "POST / signUpUser HTTP / 1.1" 500 -

Похоже, что серверный код неправильно извлекает данные или что есть проблема с тем, как данные были преобразованы в строку с помощью JSON.stringify. Я читал много других с той же проблемой и пробовал решения по переполнению стека, но получаю только ошибку 400.

1 Ответ

0 голосов
/ 29 октября 2018

Я пытался отправить словарь javascript в python-flask через ajax, используя другой подход, и он отлично работает. В случае проблема в том, что сервер не находит данные (это наиболее вероятно), вы можете черпать вдохновение из подхода, который я описываю (который, на мой взгляд, самый простой)

Моя конфигурация отличается, вы можете увидеть это обсуждение или эту ссылку для получения дополнительной информации.

1. На стороне HTML:

Соответственно загрузка jquery и добавление динамического пути к моему сайту:

<script type=text/javascript src="{{url_for('static', filename='jquery.js') }}"> </script>

<script type=text/javascript>$SCRIPT_ROOT = {{ request.script_root|tojson|safe }}; </script>

2. На стороне Jquery:

$(function(){
    $('.btn#submit').bind('click', function(){
        var dict = {};
        dict.key1 = "value1";
        dict.key2 = "value2";

        new_dict = JSON.stringify(dict);

        $.getJSON($SCRIPT_ROOT + '/_submission', {
            dict: new_dict,
        },function(data){
            alert("Data from flask" + data.new_dict_flask);
        });
    });
});

3. На стороне колбы:

@app.route('/_submission')
def submission():
    new_dict_flask = request.args.get('dict')
    return jsonify(new_dict_flask=new_dict_flask)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...