1. ホーム
  2. プログラミング言語
  3. パイソン

Flaskのエラー「TypeError.Flask」を解決する。ユニコードオブジェクトはハッシュ化する前にエンコードする必要があります"

2022-01-21 15:59:20

タグ Python フラスコ


[参考リンク
python version pit:md5 example (python2とpython3でのmd5の違い)
Pythonでhashlibを使って中国語の文字列のMD5値を求める

フォロー Flask mega チュートリアルプロジェクトへようこそ! チュートリアルでFlaskを学ぶことができます。 アバターの追加 スクリプトを実行してエラーになったとき。

TypeErrorです。Unicode オブジェクトは、ハッシュ化する前にエンコードする必要があります。

これがユーザーモデルです。

  1. class User(db.Model):
  2. id = db.Column(db.Integer, primary_key=True)
  3. nickname = db.Column(db.String(64), index=True, unique=True)
  4. email = db.Column(db.String(120), index=True, unique=True)
  5. posts = db.relationship('Posts', backref='author', lazy='dynamic')
  6. about_me = db.Column(db.String(140))
  7. last_seen = db.Column(db.DateTime)
  8. @property
  9. def is_authenticated(self):
  10. return True
  11. @property
  12. def is_active(self):
  13. return True
  14. @property
  15. def is_anonymous(self):
  16. return False
  17. def get_id(self):
  18. try:
  19. return unicode(self.id) # python2
  20. except NameError:
  21. return str(self.id) # python 3
  22. def avatar(self, size):
  23. # The following line reports an error, and according to the error message, you need to encode before encrypting
  24. return 'http://www.gravatar.com/avatar/' + md5(self.email).hexdigest() + '?d=mm&s=' + str(size)
  25. def __repr__(self):
  26. return '<User %r>' & (self.nickname)

解決策

参考文献によると
コードの違いというのは、python3では文字列をエンコードする必要があり、そうしないとエラーになるということです。

checkcode = hashlib.md5(pwd).hexdigest()



TypeError: Unicode-objects must be encoded before hashing



これは、暗号化によって文字列をバイトに変換する必要があるためで、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)



再び正常に動作し、問題は解決しました。