我正在运行一些在Python2上运行到Python3的代码,它遇到了一些问题。我有一个格式化的字符串:
auth_string = '{client_id}:{client_secret}'.format(client_id=client_id, client_secret=client_secret)
并将其作为“标题”的一部分传递:
headers = {
'Accept': 'application/json',
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',
'Authorization': 'Basic ' + b64encode(auth_string)
}
当我运行代码时,我收到此错误:
TypeError: 'str' does not support the buffer interface
经过一番研究,这是因为Python3将字符串视为unicode对象,您需要先将它们转换为字节。没问题,我改行:
'Authorization': 'Basic ' + b64encode(auth_string.encode(encoding='utf_8'))
但现在我收到了一个新错误:
TypeError: Can't convert 'bytes' object to str implicitly
我到底错过了什么?
答案 0 :(得分:4)
b64encode
接受bytes
并返回bytes
。要与字符串合并,请同时decode
。
'Authorization': 'Basic ' + b64encode(auth_string.encode()).decode()
答案 1 :(得分:2)
在Python3中,字符串是字节或 unicode 。
只需在字符串前加上 b :
b'Basic ' + b64encode(auth_string.encode(encoding='utf_8'))
答案 2 :(得分:0)
您应该将str var转换为字节var:
要将str转换为字节,str应仅包含ascii chars。
base64.64encode(auth_string.encode(encoding='ascii'))
或
base64.64encode(b'bytes string')