it-swarm.com.ru

Как преобразовать список словарей в JSON в Python/Django?

Я искал в Google и нашел ответ, но он не работает для меня. Я должен отправить список как JsonResponse в Django, похожий на этот:

list_to_json =[{"title": "hello there",
                "link": "www.domain.com",
                "date":   ...},
               {},{},{},...]

Я конвертирую это в JSON, применяя StackOverflow question1 и question2 , но у меня это не работает. Я получаю следующую ошибку:

Для того, чтобы разрешить сериализацию объектов без диктовки, установите для параметра safe значение False

Вот мой код:

    def json_response(request):
        list_to_json=[{"title": ..., "link": ..., "date": ...},{...}]
        return JsonResponse(json.dumps(list_to_json) )
10
shuboy2014
return JsonResponse(list_to_json, safe=False)

Взгляните на документацию

Безопасный логический параметр по умолчанию равен True. Если установлено значение False, любой объект может быть передан для сериализации (в противном случае разрешены только экземпляры dict). Если safe равно True, и в качестве первого аргумента передается объект, не являющийся dict, будет вызвано TypeError.

21
The Brewmaster

Вы включили сериализаторы или можете сделать это, используя safe = False для ваших данных ответа.
Подобно 

return JsonResponse(list_to_json, safe=False)
1
Projesh Bhoumik

Добавление этого ответа для всех, кто интересуется, почему это не «безопасно» по умолчанию. Упаковка недиктивной структуры данных в ответ делает службу уязвимой для атаки JSON Hijacking до ES5.

По сути, с помощью JSONResponse, который вы здесь используете, если пользователь прошел аутентификацию на вашем сайте, он теперь может получить этот список объектов {title, link, date}, и это нормально. Однако злоумышленник может включить эту конечную точку в качестве источника сценария на своей собственной вредоносной странице (межсайтовое включение сценария, также называемое XSSI):

<script src="https://www.yourwebsite.com/secretlinks/"></script>

Затем, если ничего не подозревающий аутентифицированный пользователь перейдет на вредоносную страницу, браузер неосознанно запросит массив данных с вашего сайта. Так как ваш сервис только возвращает неназначенный массив, злоумышленник также должен отравить конструктор js Array (это часть атаки, которая была исправлена ​​в ES5). До ES5 злоумышленник мог просто переопределить конструктор Array следующим образом:

Array = function() {secret = this;}

Теперь secret содержит ваш список словарей и доступен остальной части скрипта злоумышленника, где он может отправить его на свой собственный сервер. ES5 исправил это, заставив использовать скобки для оценки конструктором Array по умолчанию.

Почему это никогда не было проблемой для объектов словаря? Просто потому, что фигурные скобки в javascript обозначают изолированную область видимости, и поэтому злоумышленник не может внедрить свой собственный код в область, созданную возвращаемым словарем, который окружен фигурными скобками.

Более подробная информация здесь: https://security.stackexchange.com/questions/159609/how-is-it-possible-to-poison-javascript-array-constructor-and-how-does-ecmascrip?newreg=c70030debbca44248f54cec4cdf761bb

0
stackPusher

Это не правильный словарь: 

{"title": , "link" : , "date": }

потому что значения отсутствуют . Если вы попытаетесь добавить отсутствующие значения, это будет нормально:

>>> json.dumps([{"title": "hello there", "link": "www.domain.com", "date": 2016}, {}])
'[{"link": "www.domain.com", "date": 2016, "title": "hello there"}, {}]'
0
VHarisop