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
相关产品推荐
相关产品推荐

