Декодирование 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