'bytes'对象没有'encode'属性

时间:2016-07-07 13:11:23

标签: python python-3.x bcrypt

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

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

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

这是我的代码:

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

2 个答案:

答案 0 :(得分:3)

您正在使用:

bcrypt.gensalt()
此方法似乎生成一个字节对象。这些对象没有任何编码方法,因为它们仅适用于ASCII兼容数据。所以你可以尝试不用 .encode(' utf-8')

Bytes description in python 3 documentation

答案 1 :(得分:0)

.getsalt()方法中的 salt 是一个 bytes对象,bcrypt模块方法中的所有“ salt”参数在此特定情况下都期望它形成。无需将其转换为其他内容。

与之相反,bcrypt模块的方法中的“密码”参数应以 Unicode字符串的形式出现-在Python 3中,它只是一个 string

所以-假设您的原始document['password'] string ,则您的代码应为

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