JWT.encode报‘bytes类型无法JSON序列化’错误如何解决?
解决TypeError: Object of type 'bytes' is not JSON serializable问题
这个错误本质是JSON无法序列化bytes类型的对象,结合你的代码来看,主要有两个核心问题和对应的修复方案:
1. 立刻移除返回的密码字段(安全+序列化双重修复)
你当前的selected_user字典里包含了password字段,而bcrypt加密后的密码通常是以bytes类型存储在数据库中的,把它放进要返回的响应字典里,必然触发序列化错误。更重要的是——登录成功后绝对不能把密码返回给前端,这是严重的安全漏洞!
所以第一步先删掉password字段:
selected_user = { 'email': user.__dict__['email'], 'account_type': user.__dict__['account_type'], 'token': '' }
2. 将生成的token转为字符串
假设你是用PyJWT这类库生成token,部分版本的库返回的token是bytes类型,这时候需要用.decode('utf-8')把它转成字符串再赋值:
比如补全你的token生成逻辑后:
import jwt # 补全payload,建议加入过期时间等必要字段 payload = { 'email': user.email, 'account_type': user.account_type, 'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=24) # 示例:24小时过期 } secret_key = "你的密钥字符串" # 生成token,若返回bytes则转成字符串 token = jwt.encode(payload, secret_key, algorithm='HS256') if isinstance(token, bytes): token = token.decode('utf-8') # 赋值给selected_user selected_user['token'] = token
额外优化:避免直接访问__dict__
直接操作user.__dict__不够优雅,如果你的user对象是ORM模型(比如Django User、SQLAlchemy实例),直接访问属性更安全简洁:
selected_user = { 'email': user.email, 'account_type': user.account_type, 'token': '' }
这样修改后,你的响应字典里所有值都是JSON可序列化的类型,就不会再触发那个错误了。
内容的提问来源于stack exchange,提问作者methuselah
相关产品推荐
相关产品推荐

