Декодирование b64 данных uri django

Пользователь заполняет форму и предоставляет подпись. Подпись становится URI кодированного изображения данных и отправляется через AJAX в представление, затем она декодируется и сохраняется как png в базе данных.

Когда строка передается на сервер, она отличается от того, что я console.log() на стороне клиента. Обычно он преобразует '+' в пробельные символы - что, как я думал, я исправил, но иногда все еще выдает ошибку incorrect padding.

Это мой первый опыт работы с base64 и загрузкой файлов в Django. Не мог бы кто-нибудь подсказать мне, есть ли ошибка в коде, который я использую, или есть лучший способ отправки URI данных в представления django?

Views.py

def certify_logbook_ajax(request):
    if request.method == 'POST':
        if request.is_ajax:
            encoded_sig = request.POST.get('signature').split(',')
            encoded_sig[1] = re.sub(r"\s+", '+', encoded_sig[1])
            decoded_sig = base64.b64decode(encoded_sig[1])
            file = {'signature': SimpleUploadedFile('signature.png', decoded_sig)}
            form = CertifyLogbookForm(request.POST, file)
            form.instance.user = request.user
            if form.is_valid():
                form.save()
                return JsonResponse(....)
            else:
                return JsonResponse(form.errors.as_json(escape_html=False), safe=False)
    return Http404()

Javascript Отправлено через XMLHttpRequest

    for (let i = 0; i < formFields.length; i++) {
        ajaxStr += formFields[i].getAttribute('name') + '=' + formFields[i].value + '&';
    }
    ajaxStr += 'signature=' + signaturePad.toDataURL("image/png") + '&csrfmiddlewaretoken={{ csrf_token }}';

Журнал ошибок

Traceback (most recent call last):
  File "/Users/nicktogi/.virtualenvs/atollaviation_website/lib/python3.9/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/Users/nicktogi/.virtualenvs/atollaviation_website/lib/python3.9/site-packages/django/core/handlers/base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/nicktogi/atollaviation_website/internethq/views.py", line 628, in certify_logbook_ajax
    decoded_sig = base64.b64decode(encoded_sig[1])
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/base64.py", line 87, in b64decode
    return binascii.a2b_base64(s)

Exception Type: Error at /internethq/rplogbook/certify
Exception Value: Incorrect padding
Вернуться на верх