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并序列化数据),问题大概率出在后端的认证逻辑。
具体排查与修复步骤
检查
get_user_from_token(request)函数
这个函数如果读取了request.form、request.data或request.get_data(),会一次性消耗请求体,导致后续request.get_json()无法读取到数据。确保认证逻辑只操作请求头(比如Token在Authorization头中),不要触碰请求体内容。添加调试代码确认请求状态
在后端addUser路由开头加入以下代码,验证请求体和请求头是否正常:print("原始请求体:", request.get_data()) print("Content-Type:", request.headers.get('Content-Type'))如果请求体为空或
Content-Type不是application/json,说明请求在到达request.get_json()前已被修改。修复请求体被消耗的问题
如果get_user_from_token必须读取请求体,可先缓存请求体再重置,让后续逻辑能正常读取:def get_user_from_token(request): # 缓存请求体 raw_data = request.get_data() # 重置请求体,供后续get_json使用 request.data = raw_data # 后续认证逻辑...避免误用
jsonify
前端无需用jsonify()处理payload,requests.post的json参数会自动完成序列化,直接传入字典即可。
内容的提问来源于stack exchange,提问作者Pumba

