You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQLite User表密码重置时遇TypeError:int与bytes无法相加

解决密码重置Token生成的TypeError问题

错误原因分析

你遇到的TypeError主要来自两个itsdangerous版本兼容问题:

  • 构造参数名错误:itsdangerous 2.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 16:20:56