int в строку с кодировкой base64 на python 3.x и django-1.9

я использую python 3.4 и django-1.9. Мне нужно ввести строку и кодировать с помощью base64.

код:

new_key = base64.b64encode(str(key))

ошибка:

Traceback (most recent call last):
  File "/home/mehmet/Envs/ets-3/lib/python3.4/site-packages/django/core/handlers/base.py", line 149, in get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/mehmet/Envs/ets-3/lib/python3.4/site-packages/django/core/handlers/base.py", line 147, in get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/mehmet/Envs/ets-3/lib/python3.4/site-packages/django/views/decorators/csrf.py", line 58, in wrapped_view
    return view_func(*args, **kwargs)
  File "/home/mehmet/Envs/ets-3/lib/python3.4/site-packages/django/contrib/auth/decorators.py", line 23, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "/home/mehmet/PycharmProjects/Tango/orders/views.py", line 167, in order_info
    subscribe_item_list, mount_subscribe_discount_relation)
  File "/usr/lib/python3.4/contextlib.py", line 30, in inner
    return func(*args, **kwds)
  File "/home/mehmet/PycharmProjects/Tango/operations/order.py", line 94, in new_order
    return encryption(order.id)
  File "/home/mehmet/PycharmProjects/Tango/operations/order.py", line 15, in encryption
    new_key = base64.b64encode(str(key))
  File "/home/mehmet/Envs/ets-3/lib/python3.4/base64.py", line 62, in b64encode
    encoded = binascii.b2a_base64(s)[:-1]
TypeError: 'str' does not support the buffer interface

person KAYKISIZ    schedule 05.12.2015    source источник


Ответы (1)


В Python 3 base64.b64encode требует в качестве аргумента объект bytes, а не str, как сейчас. Вы можете справиться с этим, преобразовав целое число в key в строку байтов, а затем кодируя строку байтов в base64:

>>> key = 123456789
>>> new_key = base64.b64encode(bytes(str(key), encoding='ascii'))
>>> print(new_key)
b'MTIzNDU2Nzg5'
>>> key = -443322
>>> new_key = base64.b64encode(bytes(str(key), encoding='ascii'))
>>> print(new_key)
b'LTQ0MzMyMg=='

Здесь целое число key сначала преобразуется в строку Python 3 (тип str), а затем преобразуется в строку байтов (тип bytes) с использованием кодировки ASCII. Можно использовать любую допустимую кодировку, но ASCII, безусловно, покроет все возможные цифры и унарные -.

Для полноты в Python 2 вы можете просто сделать это:

>>> key = 123456789
>>> new_key = str(key).encode('base64')
person mhawke    schedule 05.12.2015
comment
Эта функция неэффективна, она сначала преобразует целое число в массив строк, а затем выполняет преобразование в base64. Более эффективное решение описано здесь: stackoverflow.com/a/68443789/234270 - person speedplane; 19.07.2021