You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过Ajax POST传递HTML按钮值到Flask时数据为空的问题排查

Ajax POST到Flask出现400错误或空值的原因及解决方法

我尝试通过Ajax POST将HTML中点击的按钮值传递给Flask函数,制作了如下示例,但调试时点击按钮终端出现400错误;改用request.form则得到空值ImmutableMultiDict([('search', '')])。

原HTML代码

<!DOCTYPE HTML>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.0/jquery.min.js"></script>
        <div>
            <button value="btn1">Button1</button>
            <button value="btn2">Button2</button>
        </div>
    </body>
    <script>
        $(document).ready(function() {
            $(this).on('click', function(event) {
                var value = $(this).val();
                $.ajax({
                    type : 'POST',
                    url : '/process',
                    contentType: 'application/json',
                    data : {'search' : value}
                });
                event.preventDefault();
            });
        });
    </script>
</html>

原Flask代码

from flask import Flask, render_template, request, jsonify
app = Flask(__name__)

@app.route("/")
def index():
    return render_template('index.html')

@app.route('/process', methods=['GET', 'POST'])
def process():
    value = request.get_json()
    print(value)
    return render_template('index.html')

if __name__ == "__main__":
    app.run(port=5000, debug=True)

问题根源

  • 事件绑定目标错误:原代码中$(this).on('click', ...)里的this在$(document).ready()回调中指向的是document对象,而非按钮元素。点击按钮时,$(this).val()获取的是无效值(undefined),导致传递的数据无效。
  • JSON数据未正确序列化:当设置contentType: 'application/json'时,jQuery不会自动将JavaScript对象转为JSON字符串,需要手动序列化,否则Flask无法解析请求体,返回400错误。
  • 响应类型不匹配:AJAX请求属于异步交互,返回HTML模板不符合场景,应返回JSON格式数据方便前端处理。

修正后的代码

修正版HTML

<!DOCTYPE HTML>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.0/jquery.min.js"></script>
        <div>
            <button value="btn1">Button1</button>
            <button value="btn2">Button2</button>
        </div>
    </body>
    <script>
        $(document).ready(function() {
            // 绑定点击事件到所有button元素
            $('button').on('click', function(event) {
                var value = $(this).val();
                $.ajax({
                    type : 'POST',
                    url : '/process',
                    contentType: 'application/json',
                    // 手动将对象序列化为JSON字符串
                    data : JSON.stringify({'search' : value}),
                    // 可选:处理成功响应
                    success: function(res) {
                        console.log('后端响应:', res);
                    }
                });
                event.preventDefault();
            });
        });
    </script>
</html>

修正版Flask代码

from flask import Flask, render_template, request, jsonify
app = Flask(__name__)

@app.route("/")
def index():
    return render_template('index.html')

@app.route('/process', methods=['POST'])
def process():
    # 获取并解析JSON数据
    value = request.get_json()
    print('收到的按钮值:', value)
    # 返回JSON格式响应
    return jsonify({'status': 'ok', 'button_value': value.get('search')})

if __name__ == "__main__":
    app.run(port=5000, debug=True)

可选方案:用表单格式提交

如果不想用JSON格式,可直接传递表单数据:

  • HTML中Ajax部分修改:
$.ajax({
    type : 'POST',
    url : '/process',
    data : {'search' : value},
    success: function(res) {
        console.log('后端响应:', res);
    }
});
  • Flask中修改:
@app.route('/process', methods=['POST'])
def process():
    # 通过表单获取值
    value = request.form.get('search')
    print('收到的按钮值:', value)
    return jsonify({'status': 'ok', 'button_value': value})

内容的提问来源于stack exchange,提问作者mekise

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 21:31:02