SQLite User表密码重置时遇TypeError:int与bytes无法相加
解决密码重置Token生成的TypeError问题
错误原因分析
你遇到的TypeError主要来自两个itsdangerous版本兼容问题:
- 构造参数名错误:
itsdangerous2.0+版本中,Serializer的过期时间参数需要显式指定为expires_in,而非直接传递位置参数; - 多余的decode调用:新版本的
dumps()方法直接返回字符串类型,再调用.decode('utf-8')会触发“str没有decode方法”的错误。
修正后的代码
修改User类中的get_reset_token方法即可解决问题:
def get_reset_token(self, expires_sec=1800): # 显式指定expires_in参数 s = Serializer(app.config['SECRET_KEY'], expires_in=expires_sec) # 直接返回dumps的结果,无需decode return s.dumps({'user_id': self.id})
额外优化建议
如果想更精准捕获异常(避免吞掉所有错误),可以修改verify_reset_token方法,明确捕获itsdangerous的特定异常:
from itsdangerous import Serializer, SignatureExpired, BadSignature # ... 其他代码 ... @staticmethod def verify_reset_token(token): s = Serializer(app.config['SECRET_KEY']) try: user_id = s.loads(token)['user_id'] except SignatureExpired: # Token过期 return None except BadSignature: # Token无效 return None return User.query.get(user_id)
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

