从Python 2.7迁移到3.4令牌生成器编码

从Python 2.7迁移到3.4令牌生成器编码,python,json,python-2.7,python-3.x,character-encoding,Python,Json,Python 2.7,Python 3.x,Character Encoding,我正在做我的一个老项目,我决定试用python 3,特别是3.4 我正在金字塔框架中构建,我需要生成一个用于身份验证的随机模型。之前,我只是在用户id中添加了一个随机位,一切都很好,但在Python3中,我遇到了一些编码问题 我以前就是这样做的: from base64 import b64encode, b64decode from Crypto.Hash import HMAC, SHA def create_token(request, username): r = uuid4

我正在做我的一个老项目,我决定试用python 3,特别是3.4

我正在金字塔框架中构建,我需要生成一个用于身份验证的随机模型。之前,我只是在用户id中添加了一个随机位,一切都很好,但在Python3中,我遇到了一些编码问题

我以前就是这样做的:

from base64 import b64encode, b64decode
from Crypto.Hash import HMAC, SHA

def create_token(request, username):

    r = uuid4().hex + b64encode(json.dumps({'username': username}))

    sig = HMAC.new(secret, r.encode('UTF-8'), SHA).hexdigest()
    return u"{}{}".format(sig, r)
但现在我得到了一个错误:

  File "/security.py", line 30, in create_token
    r = uuid4().hex + b64encode(json.dumps({'username': username}))
  File "/.pyenv/versions/3.4.0/lib/python3.4/base64.py", line 63, in b64encode
    encoded = binascii.b2a_base64(s)[:-1]
TypeError: 'str' does not support the buffer interface
所以我试着对用户名进行编码,结果

TypeError: b'admin' is not JSON serializable

因此编码器需要字节和JSON需要字符串,我如何在python 3中实现这一点?

JSON需要字符串,编码到JSON会生成字符串,但
b64ecode()
需要字节。对
json.dumps()的输出进行编码


请注意,
b64encode()
函数也会生成字节,因此如果要将其与UUID十六进制连接起来,则必须对这些字节进行解码。

JSON需要字符串,对JSON进行编码会生成字符串,但
b64ecode()
需要字节。对
json.dumps()的输出进行编码


请注意,
b64encode()
函数也会生成字节,因此如果要将其与UUID十六进制连接起来,则必须对这些字节进行解码。

您的回溯与发布的函数不匹配。例如,您发布的代码中没有
userid
。将userid更改为username,但这不会使您的回溯匹配。回溯中的
userid
行看起来像是多行上更大的字典语句的一部分。是的,我修改了代码,以便更清楚地了解到底是什么导致了错误。它仍然是相同的代码,但我会编辑它以使其更加一致。谢谢,只是确保我们没有遗漏某些内容。您的回溯与您发布的功能不匹配。例如,您发布的代码中没有
userid
。将userid更改为username,但这不会使您的回溯匹配。回溯中的
userid
行看起来像是多行上更大的字典语句的一部分。是的,我修改了代码,以便更清楚地了解到底是什么导致了错误。它仍然是相同的代码,但我将对其进行编辑以使其更加一致。谢谢,只是确保我们不会遗漏某些内容。它工作正常,但现在返回时我遇到另一个错误:
TypeError:无法隐式地将“bytes”对象转换为str
。但是sig中没有任何字节,秘密是一个字符串。这里有一个pastebin@Niel:Your
secret
也必须按字节排列;那个错误表明它不是。那太完美了!非常感谢。它工作正常,但现在返回时我遇到另一个错误:
TypeError:无法将“bytes”对象隐式转换为str
。但是sig中没有任何字节,秘密是一个字符串。这里有一个pastebin@Niel:Your
secret
也必须按字节排列;那个错误表明它不是。那太完美了!非常感谢你。
encoded_json = json.dumps({'username': username})
r = uuid4().hex + b64encode(encoded_json.encode('utf8')).decode('ascii')