Python中更新JSON对象值后修改未生效的问题咨询
问题原因
- 核心问题是你修改的是
json.loads()生成的临时对象,没有将修改后的结果回写到session中。每次执行json.loads(session['userBoard'])都会生成一个全新的Python列表对象,你在循环中对这个临时列表的修改不会同步到session里存储的原始JSON字符串,因此读取时自然看不到更新。 - 循环逻辑存在错误:当前只要遍历到的条目id不匹配就会打印
Nothing found!,就算后续存在匹配的条目也会触发无效打印。 - 如果你打印的是代码中声明的全局变量
userBoard,它和session中存储的userBoard是完全独立的两份数据,修改session不会自动同步到全局变量,而且全局变量在Flask多请求场景下是线程不安全的,不建议用来存储单用户数据。
解决方案
确实需要额外做序列化操作,步骤如下:
- 先将session中的JSON字符串反序列化为Python对象,存入临时变量
- 遍历修改临时变量的对应条目
- 将修改后的临时变量重新序列化为JSON字符串,赋值回
session['userBoard']
修正后的代码示例:
import json from flask import request, session @app.get("/setItem") def setItem(): id = request.args.get('itemId') id = int(id[2:]) # 1. 反序列化到临时变量 user_board = json.loads(session['userBoard']) found = False # 2. 遍历修改 for item in user_board: if item['id'] == id: item['solved'] = 'true' found = True break # 匹配到就可以提前退出循环 if not found: print('Nothing found!') # 3. 序列化后回写session session['userBoard'] = json.dumps(user_board) # 如果你的业务确实需要用到全局变量userBoard,这里同步更新即可(不推荐使用全局变量) # global userBoard # userBoard = session['userBoard'] return 'OK'
如果修改后仍不生效,可以在给session赋值后添加session.modified = True强制Flask将session更新持久化。
内容的提问来源于stack exchange,提问作者Patrick
相关产品推荐
相关产品推荐

