TypeError:Unicode对象哈希前需编码,代码报错求助
解决TypeError: Unicode-objects must be encoded before hashing错误
这个报错在Python 3里太常见了,我来给你拆解下原因和解决办法:
错误原因
你遇到的问题核心是Python 3对字符串和字节的严格区分:hashlib里的哈希函数(比如md5)只接受字节(bytes)类型的数据,但你从request.data['password']拿到的是Python的Unicode字符串,直接传给md5.update()自然会触发TypeError。
解决方法
只需要把字符串编码成字节就行,两种常用方式任你选:
方式一:直接在update时编码
修改你代码里的md5.update(passwd)这一行,指定编码格式(推荐用UTF-8,通用性最强):
user = Data() passwd = request.data['password'] md5 = hashlib.md5() md5.update(passwd.encode('utf-8')) # 关键:把字符串转成字节 user.password = md5.hexdigest() print(user.password) user.save()
方式二:提前编码好字节对象
如果之后还要用到编码后的密码,也可以先转成bytes再传入:
user = Data() passwd = request.data['password'] passwd_bytes = passwd.encode('utf-8') # 先转成字节 md5 = hashlib.md5() md5.update(passwd_bytes) user.password = md5.hexdigest() print(user.password) user.save()
额外提醒
- 编码格式一定要统一,别一会儿用UTF-8一会儿用GBK,不然不同环境下计算出的哈希值会不一样。
- 另外,生产环境里不建议只用MD5存储密码,安全性太低,推荐用bcrypt、Argon2这类专门的密码哈希算法。
内容的提问来源于stack exchange,提问作者user9341676
相关产品推荐
相关产品推荐

