解决Flask错误“TypeError: Unicode-objects must be encoded before hashing”

标签: Python Flask


【参考链接】
python版本坑:md5例子(python2与python3中md5区别)
Python 用hashlib求中文字符串的MD5值

跟着欢迎进入Flask大型教程项目!的教程学习Flask,到了添加头像的时候,运行脚本后报错:

TypeError: Unicode-objects must be encoded before hashing

这是用户模型:

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    nickname = db.Column(db.String(64), index=True, unique=True)
    email = db.Column(db.String(120), index=True, unique=True)
    posts = db.relationship('Post', backref='author', lazy='dynamic')
    about_me = db.Column(db.String(140))
    last_seen = db.Column(db.DateTime)

    @property
    def is_authenticated(self):
        return True

    @property
    def is_active(self):
        return True

    @property
    def is_anonymous(self):
        return False

    def get_id(self):
        try:
            return unicode(self.id)  # python2
        except NameError:
            return str(self.id)  # python 3

    def avatar(self, size):
        # 下面这行报错误,按照错误提示来看,加密之前需要encode
        return 'http://www.gravatar.com/avatar/' + md5(self.email).hexdigest() + '?d=mm&s=' + str(size)

    def __repr__(self):
        return '' & (self.nickname)


解决方法:

按照参考资料里面的说法:
按代码差异来将,就是在python3中需要对字符串进行 encode 操作,如果没有则会报错:
checkcode = hashlib.md5(pwd).hexdigest()
TypeError: Unicode-objects must be encoded before hashing
这是因为加密时需要将字符串转化为 bytes 类型,3默认编码是 utf-8 .所以我用utf-8进行解码.

于是把出错的地方:return 'http://www.gravatar.com/avatar/' + md5(self.email).hexdigest() + '?d=mm&s=' + str(size)
修改为:return 'http://www.gravatar.com/avatar/' + md5(self.email.encode("latin1")).hexdigest() + '?d=mm&s=' + str(size)
再次运行正常,问题解决。

你可能感兴趣的:(解决Flask错误“TypeError: Unicode-objects must be encoded before hashing”)