关于python:’bytes’对象没有属性’encode’

'bytes' object has no attribute 'encode'

在将每个文档插入到集合之前,我尝试存储salt和哈希密码。但在编码salt和密码时,会显示以下错误:

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

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

这是我的代码:

1
2
3
4
5
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'])

我正在使用virtualenv中的eve框架和python 3.4


你用的是:

1
bcrypt.gensalt()

。此方法似乎生成了一个bytes对象。这些对象没有任何编码方法,因为它们只处理与ASCII兼容的数据。所以你可以尝试不使用.encode("utf-8")。

python 3文档中的字节描述


来自.getsalt()方法的salt是一个字节对象,bcrypt模块方法中的所有"salt"参数都期望它具有这种特殊形式。没有必要把它转换成其他东西。

与此相反,bcrypt模块方法中的"password"参数应该以unicode字符串的形式出现——在python 3中,它只是一个字符串。

所以-假设您的原始document['password']是一个字符串,那么您的代码应该是

1
2
3
4
5
def before_insert(documents):
    for document in documents:
        document['salt'] = bcrypt.gensalt()
        password = document['password']
        document['password'] = bcrypt.hashpw(password, document['salt'])