Я пытаюсь обработать входящие запросы JSON / Ajax с Django / Python.
request.is_ajax()
это True
по просьбе, но я понятия не имею , где полезную нагрузку с данными JSON.
request.POST.dir
содержит это:
['__class__', '__cmp__', '__contains__', '__copy__', '__deepcopy__', '__delattr__',
'__delitem__', '__dict__', '__doc__', '__eq__', '__ge__', '__getattribute__',
'__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__',
'__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__setattr__', '__setitem__', '__str__', '__weakref__', '_assert_mutable', '_encoding',
'_get_encoding', '_mutable', '_set_encoding', 'appendlist', 'clear', 'copy', 'encoding',
'fromkeys', 'get', 'getlist', 'has_key', 'items', 'iteritems', 'iterkeys', 'itervalues',
'keys', 'lists', 'pop', 'popitem', 'setdefault', 'setlist', 'setlistdefault', 'update',
'urlencode', 'values']
Похоже, в запросе нет ключей.
Когда я смотрю на POST в Firebug , в запросе передаются данные JSON.
len(request.POST)
иrequest.POST.items()
также поможет.Ответы:
Если вы публикуете JSON в Django, я думаю, что вы хотите
request.body
(request.raw_post_data
в Django <1.4). Это даст вам необработанные данные JSON, отправленные по почте. Оттуда вы можете обработать его дальше.Вот пример использования JavaScript, jQuery , jquery-json и Django.
JavaScript:
Джанго:
Джанго <1.4:
источник
self.client.post('/event/save-json/', json.dumps(python_dict), HTTP_X_REQUESTED_WITH='XMLHttpRequest', content_type="application/json")
У меня такая же проблема. Я публиковал сложный ответ JSON и не мог прочитать свои данные, используя словарь request.POST.
Мои данные JSON POST были:
В этом случае вам нужно использовать метод, предоставленный aurealus. Прочтите request.body и десериализуйте его с помощью json stdlib.
источник
json_data = simplejson.loads(request.raw_post_data)
вы уверены, что правильно написали?django.utils.simplejson
был удален в последних версиях. Просто используйтеjson
библиотеку stdlib .Способ 1
Клиент: Отправить как
JSON
Сервер:
Способ 2
Клиент: Отправить как
x-www-form-urlencoded
(Примечание:
contentType
&processData
изменилось,JSON.stringify
не нужно)Сервер:
Изменено в 1.5+: https://docs.djangoproject.com/en/dev/releases/1.5/#non-form-data-in-http-requests
Вероятно, связано
источник
django.http.request.RawPostDataException: You cannot access body after reading from request's data stream
Важно помнить, что в Python 3 есть другой способ представления строк - это байтовые массивы.
Используя Django 1.9 и Python 2.7 и отправляя данные JSON в основной части (не в заголовке), вы бы использовали что-то вроде:
Но для Django 1.9 и Python 3.4 вы бы использовали:
Я только что прошел эту кривую обучения, делая свое первое приложение Py3 Django!
источник
request.raw_response
сейчас устарела. использованиеrequest.body
Вместо этого для обработки нетрадиционных данных формы, таких как полезные данные XML, двоичные изображения и т. Д.Джанго документация по этому вопросу .
источник
на джанго 1.6 питон 3.3
клиент
сервер
источник
Полезная нагрузка HTTP POST - это просто набор байтов. Django (как и большинство фреймворков) декодирует его в словарь из параметров, закодированных в URL, или из MIME-multipart-кодирования. Если вы просто сбросите данные JSON в содержимом POST, Django не будет их декодировать. Либо выполните JSON-декодирование из полного содержимого POST (не из словаря); или поместите данные JSON в многокомпонентную оболочку MIME.
Короче, покажи код JavaScript. Проблема, кажется, там.
источник
request.raw_post_data
был объявлен устаревшим Используйтеrequest.body
вместоисточник
Что-то вроде этого. Работает: запрос данных от клиента
Обработать запрос на сервере
источник
источник
Используя Angular, вы должны добавить заголовок к запросу или добавить его в заголовки конфигурации модуля:
{'Content-Type': 'application/x-www-form-urlencoded'}
источник
request.POST - это просто словарь-подобный объект, поэтому просто индексируйте его с помощью синтаксиса dict.
Предполагая, что ваше поле формы fred, вы можете сделать что-то вроде этого:
В качестве альтернативы используйте объект формы для работы с данными POST.
источник