标签: 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 '<User %r>' & (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)
再次运行正常,问题解决。
网友评论