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

Flask应用添加用户时JSON有效性错误:Expecting value: line1 column1

问题

开发Flask应用时,添加用户的前端路由在表单提交后触发,收到错误提示:Expecting value: line 1 column 1 (char 0),怀疑应用未接收请求负载。后端接口在Postman中测试正常,尝试用jsonify()处理payload时触发错误。

相关代码如下:

前端代码

@app.route('/add-user', methods=['POST'])
def addUser():
    username = request.form.get('username')
    email = request.form.get('email')
    password = request.form.get('password')

    # 验证数据
    if not username or not email or not password:
        flash("所有字段均为必填项。", "error")
        return redirect('/')

    payload = {
        "username": username,
        "email": email,
        "password": password
    }

    # 调用API添加用户
    try:
        response = requests.post('http://' + BACK_END_IP + ':' + BACK_END_PORT + '/add-user', json=payload)
        if response.status_code == 200:
            flash("用户添加成功。", "success")
            return redirect('/')
        else:
            error_message = response.json().get("error", "未知错误。")
            flash(f"错误: {error_message}", "error")
            return redirect('/')
    except requests.exceptions.RequestException as e:
        flash(f"无法连接到API。详情: {str(e)}", "error")

    return redirect('/')

后端代码

@app.route('/add-user', methods=['POST'])
def addUser():
    current_user = get_user_from_token(request)
    if current_user.admin:
        data = request.get_json()
        username = data.get('username')
        email = data.get('email')
        password = data.get('password')

        if not username or not email or not password:
            return jsonify({"error": "所有字段均为必填项。"}), 400

        # 创建用户及账户
        try:
            new_user = User(public_id=str(uuid.uuid4()), username=username, password=hash_password(password), email=email,
                            admin=False, two_factor_enabled=False, valid_code=None, valid_code_exp=None,
                            reset_pswd_code=None, reset_pswd_exp=None)
            db.session.add(new_user)
            db.session.commit()
            account_user = Account(user=new_user.id, public_id=str(uuid.uuid4()), balance=0)
            db.session.add(account_user)
            db.session.commit()

            return jsonify({"message": "用户添加成功。"}), 200
        except Exception as e:
            # 捕获并显示错误
            db.session.rollback()
            return jsonify({'message': f"发生错误: {str(e)}"}), 500
    else:
        return jsonify({'message': '你不是管理员'}), 401
解决方案

错误原因

Expecting value: line 1 column 1 (char 0) 通常是request.get_json()尝试解析空请求体或非JSON格式请求体时抛出的。前端代码中用requests.post(..., json=payload)是正确的(会自动设置Content-Type: application/json并序列化数据),问题大概率出在后端的认证逻辑。

具体排查与修复步骤

  1. 检查get_user_from_token(request)函数
    这个函数如果读取了request.form、request.data或request.get_data(),会一次性消耗请求体,导致后续request.get_json()无法读取到数据。确保认证逻辑只操作请求头(比如Token在Authorization头中),不要触碰请求体内容。

  2. 添加调试代码确认请求状态
    在后端addUser路由开头加入以下代码,验证请求体和请求头是否正常:

    print("原始请求体:", request.get_data())
    print("Content-Type:", request.headers.get('Content-Type'))
    

    如果请求体为空或Content-Type不是application/json,说明请求在到达request.get_json()前已被修改。

  3. 修复请求体被消耗的问题
    如果get_user_from_token必须读取请求体,可先缓存请求体再重置,让后续逻辑能正常读取:

    def get_user_from_token(request):
        # 缓存请求体
        raw_data = request.get_data()
        # 重置请求体,供后续get_json使用
        request.data = raw_data
        # 后续认证逻辑...
    
  4. 避免误用jsonify
    前端无需用jsonify()处理payload,requests.post的json参数会自动完成序列化,直接传入字典即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 00:23:19