You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

通过AJAX从JavaScript向Python传参时遇NoneType下标错误求助

解决Flask中request.jsonNone导致的类型错误

你遇到的TypeError: 'NoneType' object is not subscriptable,本质是Flask没能成功把AJAX发送的请求体解析成JSON对象,导致request.json返回了None,后续尝试用下标访问None自然就报错了。下面是一步步排查和解决的方案:

1. 先确认AJAX请求的Content-Type头是否正确发送

虽然你的JS代码里设置了contentType: 'application/json',但最好在浏览器里验证一下实际发送的请求:

  • 按F12打开开发者工具,切换到Network标签
  • 点击触发AJAX的按钮,找到对应的POST请求,查看它的Request Headers
  • 确认Content-Type的值确实是application/json

如果这个头没正确发送,Flask就不会自动解析请求体为JSON,request.json就会是None

2. 用更健壮的request.get_json()替代直接访问request.json

Flask提供的request.get_json()方法比直接访问request.json更灵活,还能处理解析错误。修改你的Python代码如下:

@app.route('/', methods=['GET', 'POST']) 
@login_required 
def index(): 
    if request.method == "POST": 
        # 尝试解析JSON请求体,失败则返回明确错误
        data = request.get_json()
        if not data:
            return jsonify({"error": "无效或缺失的JSON数据"}), 400
        
        # 安全获取user_id,避免键不存在的错误
        user_id = data.get('user_id')
        if not user_id:
            return jsonify({"error": "请求数据中缺少user_id字段"}), 400
        
        return jsonify({'id': user_id}) 
    return render_template('index.html', title='Homepage')

如果遇到Content-Type头异常的情况,还可以临时用request.get_json(force=True)强制解析(不推荐长期依赖,最好还是保证请求头正确)。

3. 验证AJAX发送的JSON数据是否有效

你的JS代码里用JSON.stringify(ids)转换数据是对的,但可以加个日志确认发送的内容:

var ids = { 'user_id': col1 }; 
console.log('发送的数据:', JSON.stringify(ids)); // 打印要发送的JSON字符串
$.ajax({ 
    // 其他配置不变
});

确保打印出来的是有效JSON,比如{"user_id": "123"}这种格式,没有语法错误。

4. 检查是否有CSRF保护干扰请求

如果你的Flask应用用了Flask-WTF这类带CSRF保护的插件,AJAX请求需要额外带上CSRF令牌,否则Flask会拒绝解析请求体:

  • 先在HTML页面里添加元标签:
    <meta name="csrf-token" content="{{ csrf_token() }}">
    
  • 然后在JS代码里全局设置AJAX请求头:
    $.ajaxSetup({
        headers: {
            'X-CSRFToken': $('meta[name="csrf-token"]').attr('content')
        }
    });
    

这是很容易被忽略的点,很多时候AJAX看起来发送正常,但因为CSRF验证不通过导致请求体无法被解析。

按照上面的步骤排查,优先检查CSRF令牌和Content-Type头,这两个是最常见的诱因,应该能解决你的问题。

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

火山引擎 最新活动