Как отправить данные из входных данных Javascript во Flask - PullRequest
0 голосов
/ 20 марта 2019

У меня есть таблица с кнопками для каждой строки. Если я нажму кнопку, скажем, строку 3, идентификатор строки 3 появится как в предупреждении, так и в console.log. В конечном итоге я хочу отправить идентификатор строки в флакон python, а затем этот номер идентификатора можно использовать для удаления или дублирования рассматриваемой строки.

Мне нужно использовать пост Ajax, и он прекрасно работает с этим примером по ссылке ниже. https://github.com/bsaldivaremc2/send_receive_data_with_flask

Когда я изменяю свой существующий код, чтобы включить пост Ajax из примера по ссылке выше, я продолжаю получать эту ошибку в командном терминале и в консоли проверять.

Командный терминал:

TypeError: объект 'int' не вызывается Функция просмотра не вернула правильный ответ. Тип возвращаемого значения должен быть строкой, кортежем, экземпляром Response или вызываемым WSGI, но это должен быть int.

Консоль проверяет: POST http://127.0.0.1:5000/delete_data 500 (ОШИБКА ВНУТРЕННЕГО СЕРВЕРА)

Вот мой HTML / JS

test2.html

<!DOCTYPE html>
<html>

<head>

<meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <title></title>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <meta name="robots" content="noindex, nofollow">
  <meta name="googlebot" content="noindex, nofollow">
  <meta name="viewport" content="width=device-width, initial-scale=1">

<meta name="viewport" content="width=device-width, initial-scale=1">

<link rel="stylesheet" href="https://www.w3schools.com/w3css/4/w3.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
<script   src="http://code.jquery.com/jquery-3.3.1.min.js"   integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8="   crossorigin="anonymous"></script>
<script   src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js"   integrity="sha256-VazP97ZCwtekAsvgPBSUwPFKdrwD3unUfSGVYrahUqU="   crossorigin="anonymous"></script>


<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>

<script>
    type="text/javascript"
    src="//code.jquery.com/jquery-1.9.1.js"
</script>

<title>Test 1</title>

<style>


table, th, td {
  border: 1px solid black;
  border-collapse: collapse;
}



</style>

</head>
<body>




<table id="table-test">
<tr><th>ID</th><th>Student</th><th>Delete</th></tr>

<tr><td class="ids">1</td><td>Chelsey</td><td><button id="Approved">Del</button></td></tr>

<tr><td class="ids">2</td><td>Michael</td><td><button id="Approved">Del</button></td></tr>
<tr><td class="ids">3</td><td>Jared</td><td><button id="Approved">Del</button></td></tr>
</table>



<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script   src="http://code.jquery.com/jquery-3.3.1.min.js"   integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8="   crossorigin="anonymous"></script>
<script   src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js"   integrity="sha256-VazP97ZCwtekAsvgPBSUwPFKdrwD3unUfSGVYrahUqU="   crossorigin="anonymous"></script>



<script type="text/javascript">




$(document).ready(function(){
$(document).on("click","#Approved",function(){
    var info = $(this).parent().siblings('.ids').text();
    var all_info  = $(this).parent().siblings("#table-test");

    alert(info);

    console.log("Del button clicked!");


    var num = info.trim().toString();

    console.log(num);
    console.log(typeof(num));

    var row = {"id": num};

    row["id"] = num;

    console.log(typeof(num));

    var server = "http://127.0.0.1:5000";
    var appdir = "/delete_data";

    $.ajax({

        type:"POST",
        url: server+ appdir,
        data: JSON.stringify(info),
        dataType: "json",
        contentType: "application/json;charset=UTF-8",
        success: function(res){

            console.log(res);
        }
    })


});

});


</script>

</body>
</html>

My Flask Я пытаюсь отправить номер идентификатора строки в функцию просмотра delete_data.

from flask import render_template, jsonify, Flask
import json

app = Flask(__name__)

@app.route("/delete_data", methods = ["GET", "POST"])
def delete_data():


    print("Deleting selected row!")
    rf = request.form
    print(rf)


    for key in rf.keys():


        data = key


    print("DATA: ", data)

    data_dic = json.loads(data)

    id_data = data_dic["id"]

    print(data_dic)
    print(id_data)


    print(type(data_dic))
    print(type(id_data))


    return id_data





@app.route("/test2", methods = ["GET", "POST"])
def test2():


    return render_template("test2.html")


if __name__ == "__main__":

    app.run(debug=True)

Любая помощь будет принята с благодарностью. Спасибо!

1 Ответ

2 голосов
/ 20 марта 2019

Сообщение об ошибке в значительной степени говорит обо всем.Проблема, скорее всего, заключается в следующем:

id_data = data_dic["id"]
...
return id_data

Вы возвращаете id_data, что является int, но вам необходимо вернуть любой из типов, указанных в сообщении об ошибке.Попробуйте это так:

return jsonify({'id': id_data})

РЕДАКТИРОВАТЬ: Чтобы ответить на следующий вопрос в комментарии.Вы получаете пустой словарь при печати request.form (как переменная rf), потому что вы фактически не публикуете данные формы в функцию представления, но отправляете тело JSON в запросе POST.Чтобы получить данные, вы должны использовать request.get_json() вместо request.form.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...