2015-09-22 2 views
2

Я запускаю код, который работает на Python2 на Python3, и у него есть некоторые проблемы. У меня есть строка с форматированием:b64encode при переходе с 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 

Что именно я здесь отсутствует?

ответ

4

b64encode принимает bytes и возвращает bytes. Чтобы объединиться со строкой, сделайте также decode.

'Authorization': 'Basic ' + b64encode(auth_string.encode()).decode() 
+0

Это сделало трюк! Огромное спасибо. Похоже, я забыл, что вам нужно слиться со струной. – GreenGodot

2

в Python3, строки либо байт или юникода.

Просто префикс для ваших строк с б:

b'Basic ' + b64encode(auth_string.encode(encoding='utf_8')) 
0

Вы должны отдать свой ул вар в байтах вар:

Чтобы отливать ул байтами ул должно быть содержание только ASCII символы.

base64.64encode(auth_string.encode(encoding='ascii')) 

или

base64.64encode(b'bytes string') 
+0

Я думаю, вы хотите использовать «encoding =» вместо «encode =», поскольку последнее является недопустимым ключевым словом. Ваш первый метод, по крайней мере, не работает. Возможно ли префикс строкового объекта? например (B''auth_code)? – GreenGodot

+0

Да, имя параметра «кодирование», извините. – Garet

+0

Вы не можете использовать префикс с объектами. Должен использовать байты (mystring.encode (encoding = 'ascii')) или байты (mystring.encode ('ascii')) – Garet

Смежные вопросы