Django Ajax Публикация с содержанием HTML с использованием JSON .stringify затем json .loads error - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть текстовое поле в форме на веб-странице с содержимым "HTML".

<!-- HTML -->
<textarea id="my-textarea">
    <div class="this">Content here &amp; here!</div>
</textarea>

Я извлекаю содержимое с помощью Javascript и использую encodeURIComponent для безопасного кодирования строки для AJAX JSON. и сохранить его в массиве ключ / значение. (python dict)

// Javascript
var textarea = document.getElementById('my-textarea').value;
var data = {};
data['html'] = encodeURIComponent(textarea);
console.log(data);
// prints --> {html: "%3Cdiv%20class%3D%22this%22%3EContent%20here%20%26amp%3B%20here%3C%2Fdiv%3E"}

// In AJAX function.
var json = "data=" + JSON.stringify(data);

Затем я отправляю данные в Django представление на основе классов, и в посте у меня есть

# Python / Django
if request.is_ajax():
    print(request.POST)
    # prints --> <QueryDict: {'data': ['{"code":"<div class="this">Content here &amp; here</div>"}']}>

    data = request.POST.get('data', None)
    if data:
        data = json.loads(data)

Это выдает ошибку, как показано ниже:

Traceback (most recent call last):
  File "/home/tr/dev/host-root/apps/trenddjango2/venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/home/tr/dev/host-root/apps/trenddjango2/venv/lib/python3.8/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/tr/dev/host-root/apps/trenddjango2/venv/lib/python3.8/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/tr/dev/host-root/apps/trenddjango2/venv/lib/python3.8/site-packages/django/views/generic/base.py", line 71, in view
    return self.dispatch(request, *args, **kwargs)
  File "/home/tr/dev/host-root/apps/trenddjango2/django/common/views/dashboard/mixins.py", line 56, in dispatch
    return super(TemplateDashboardMixin, self).dispatch(request, *args, **kwargs)
  File "/home/tr/dev/host-root/apps/trenddjango2/venv/lib/python3.8/site-packages/django/views/generic/base.py", line 97, in dispatch
    return handler(request, *args, **kwargs)
  File "/home/tr/dev/host-root/apps/trenddjango2/django/common/views/dashboard/catalogue.py", line 550, in post
    data = json.loads(jsonData)
  File "/usr/local/lib/python3.8/json/__init__.py", line 357, in loads
    return _default_decoder.decode(s)
  File "/usr/local/lib/python3.8/json/decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/local/lib/python3.8/json/decoder.py", line 353, in raw_decode
    obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Expecting ',' delimiter: line 1 column 22 (char 21)

Я обнаружил, что если я удалю "" двойные кавычки в классе = "this", строка будет загружена правильно.

Мой вопрос: как мне загрузить строку JSON с двойными кавычками в python, даже если ее экранировать как% 22?

1 Ответ

0 голосов
/ 28 февраля 2020

Используйте \\ для выхода из него.

json.loads('{"code":"<div class=\\"this\\">Content here &amp; here</div>"}')

это будет работать так, как вы ожидали. В приведенном ниже примере показано, как убежать.

'<div class="this">Content here &amp; here!</div>'.replace(/"/g, '\\\\"')

Результат:

"<div class=\\"this\\">Content here &amp; here!</div>"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...