web-dev-qa-db-fra.com

L'objet 'bytes' n'a pas d'attribut 'encoder'

J'essaie de stocker le sel et le mot de passe haché avant d'insérer chaque document dans une collection. Mais lors de l’encodage du sel et du mot de passe, il affiche l’erreur suivante:

 line 26, in before_insert
 document['salt'] = bcrypt.gensalt().encode('utf-8')

AttributeError: 'bytes' object has no attribute 'encode'

Ceci est mon code: 

def before_insert(documents):
    for document in documents:
        document['salt'] = bcrypt.gensalt().encode('utf-8')
        password = document['password'].encode('utf-8')
        document['password'] = bcrypt.hashpw(password, document['salt'])

J'utilise eve framework dans virtualenv avec python 3.4

9
DEVV911

Vous utilisez: 

bcrypt.gensalt ()
Cette méthode semble générer un objet octet. Ces objets n'ont aucune méthode de codage car ils ne fonctionnent qu'avec des données compatibles ASCII. Vous pouvez donc essayer sans .encode ('utf-8')

Description des octets dans la documentation python 3

2
Kreu

Le salt de la méthode .getsalt() est un objet bytes, et tous les paramètres "salt" des méthodes du module bcrypt l'attendent sous cette forme particulière. Il n'est pas nécessaire de le convertir en autre chose.

Contrairement à cela, les paramètres "password" dans les méthodes du module bcrypt sont attendus sous la forme de la chaîne Unicode - en Python 3, il s’agit simplement d’une chaîne string.

Donc, en supposant que votre document['password'] original soit un string, votre code devrait être

def before_insert(documents):
    for document in documents:
        document['salt'] = bcrypt.gensalt()
        password = document['password']
        document['password'] = bcrypt.hashpw(password, document['salt'])
0
MarianD