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

Flask中request.form处理用户JSON数据及MySQL JSON列更新问题

解决MySQL JSON列更新问题及400错误排查

先搞定400 Bad Request错误

这个错基本是请求数据和后端预期对不上导致的,从这几个方向查就行:

  • 字段名要完全匹配:检查前端HTML表单里的name属性和你后端request.form里取的键是不是一模一样,比如managedBY的大小写、拼写,别写成managedBy或者managed_by了。
  • 别直接硬取字段:如果前端没传某个字段(比如managerid),你用request.form['managerid']直接拿会触发报错,Flask直接返回400。不如换成request.form.get('managerid'),没值的时候返回None,不会直接崩。
  • JSON格式别乱传:如果前端传的managedBY是逗号分隔的字符串(比如"1,2,3"),你直接存到JSON列里会格式错误,MySQL拒绝后就会引发请求错误。

实现MySQL JSON列的增、删、改操作

假设你的managedBY列是JSON类型,存的是管理员ID数组(比如[1,3,5]),给你几种实操方法:

1. Python转JSON字符串存

先把前端传来的管理员ID转成Python列表,再用json.dumps()转成JSON字符串,再更新到数据库:

import json

@Admin.route('/update', methods = ['POST' , 'GET'])
def update():
    if request.method == 'POST':
        # 用get方法避免字段缺失报错
        id = request.form.get('userid')
        name = request.form.get('name')
        email = request.form.get('email')
        role = request.form.get('role')
        managerid = request.form.get('managerid')
        # 处理managedBY:假设前端传的是逗号分隔的ID字符串,比如"1,2,3"
        managed_by_str = request.form.get('managedBY', '')
        # 转成整数列表(ID是数字的话)
        managed_by_list = [int(x.strip()) for x in managed_by_str.split(',') if x.strip()]
        # 转成标准JSON字符串
        managed_by_json = json.dumps(managed_by_list)

        try:
            connection = create_connection()
            cursor = connection.cursor()
            sql = "UPDATE users SET name= %s, email= %s, role=%s, managerid=%s, managedBY=%s WHERE userid= %s"
            values = (name , email, role, managerid, managed_by_json, id)
            cursor.execute(sql , values)
            connection.commit()
            flash("数据更新成功")
        except pymysql.connect.Error as err:
            print('错误: ', err)
            flash(f"更新失败: {str(err)}")
        finally:
            connection.close()
            print('数据库连接已关闭.')

        return redirect(url_for('Admin.Index'))

2. 用MySQL自带的JSON函数操作(推荐)

不想在Python里处理JSON的话,直接用MySQL的JSON函数改数据:

  • 加管理员:用JSON_ARRAY_APPEND往数组里加元素
UPDATE users 
SET managedBY = JSON_ARRAY_APPEND(managedBY, '$', %s) 
WHERE userid = %s
  • 删管理员:用JSON_REMOVE移除指定元素(要先找元素索引,用JSON_SEARCH定位)
UPDATE users 
SET managedBY = JSON_REMOVE(managedBY, JSON_UNQUOTE(JSON_SEARCH(managedBY, 'one', %s))) 
WHERE userid = %s
  • 替换整个管理员列表:和第一种方法一样,直接传JSON字符串覆盖就行

3. 前端优化传参方式

如果前端能改,用多选框选管理员,然后用JS把选中的ID转成JSON字符串存到隐藏字段里提交:

<!-- 多选框选管理员 -->
<input type="checkbox" name="manager" value="1">管理员1
<input type="checkbox" name="manager" value="2">管理员2
<!-- 隐藏字段存JSON格式的ID列表 -->
<input type="hidden" name="managedBY" id="managedBY">

<script>
// 提交前把选中的ID转成JSON
document.querySelector('form').addEventListener('submit', function(e) {
  const checkboxes = document.querySelectorAll('input[name="manager"]:checked');
  const managerIds = Array.from(checkboxes).map(cb => parseInt(cb.value));
  document.getElementById('managedBY').value = JSON.stringify(managerIds);
});
</script>

这样后端直接拿request.form.get('managedBY')就是标准JSON字符串,直接存数据库就行。

额外提醒

  • 确保你的MySQL版本是5.7及以上,才支持JSON类型
  • 存JSON的时候一定要保证格式合法,不然MySQL会报错
  • 调试的时候可以打印request.form看看实际收到的数据,方便定位问题:print(request.form)

内容的提问来源于stack exchange,提问作者Bilge Kaan Özkan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 13:20:03