J'essaie de traiter les demandes JSON / Ajax entrantes avec Django / Python.
request.is_ajax()
est True
sur la demande, mais je n'ai aucune idée de l'emplacement de la charge utile avec les données JSON.
request.POST.dir
contient ceci:
['__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']
Il n'y a apparemment aucune clé dans les clés de message de demande.
Lorsque je regarde le POST dans Firebug , des données JSON sont envoyées dans la demande.
len(request.POST)
etrequest.POST.items()
aiderait également.Réponses:
Si vous publiez du JSON sur Django, je pense que vous le souhaitez
request.body
(request.raw_post_data
sur Django <1.4). Cela vous donnera les données JSON brutes envoyées via la poste. De là, vous pouvez le traiter davantage.Voici un exemple utilisant JavaScript, jQuery , jquery-json et Django.
JavaScript:
Django:
Django <1.4:
la source
self.client.post('/event/save-json/', json.dumps(python_dict), HTTP_X_REQUESTED_WITH='XMLHttpRequest', content_type="application/json")
J'ai eu le même problème. J'avais publié une réponse JSON complexe et je ne pouvais pas lire mes données à l'aide du dictionnaire request.POST.
Mes données JSON POST étaient:
Dans ce cas, vous devez utiliser la méthode fournie par aurealus. Lisez le request.body et désérialisez-le avec le json stdlib.
la source
json_data = simplejson.loads(request.raw_post_data)
êtes-vous sûr que c'est correctement indiqué?django.utils.simplejson
a été supprimé dans les versions récentes. Utilisez simplement lajson
bibliothèque stdlib .Méthode 1
Client: envoyer en tant que
JSON
Serveur:
Méthode 2
Client: Envoyer en tant que
x-www-form-urlencoded
(Remarque:
contentType
&processData
ont changé,JSON.stringify
n'est pas nécessaire)Serveur:
Modifié dans la version 1.5+: https://docs.djangoproject.com/en/dev/releases/1.5/#non-form-data-in-http-requests
Probablement lié
la source
django.http.request.RawPostDataException: You cannot access body after reading from request's data stream
Il est important de se rappeler que Python 3 a une manière différente de représenter les chaînes - ce sont des tableaux d'octets.
En utilisant Django 1.9 et Python 2.7 et en envoyant les données JSON dans le corps principal (pas un en-tête), vous utiliseriez quelque chose comme:
Mais pour Django 1.9 et Python 3.4, vous utiliseriez:
Je viens de passer par cette courbe d'apprentissage en créant ma première application Py3 Django!
la source
request.raw_response
est désormais obsolète. Utilisationrequest.body
plutôt pour traiter des données de formulaire non conventionnelles telles que des charges utiles XML, des images binaires, etc.Documentation Django sur le problème .
la source
sur django 1.6 python 3.3
client
serveur
la source
La charge utile HTTP POST est juste un ensemble plat d'octets. Django (comme la plupart des frameworks) le décode dans un dictionnaire à partir de paramètres encodés en URL ou d'un encodage MIME-multipart. Si vous videz simplement les données JSON dans le contenu POST, Django ne les décodera pas. Soit faites le décodage JSON à partir du contenu POST complet (pas du dictionnaire); ou placez les données JSON dans un wrapper MIME en plusieurs parties.
En bref, montrez le code JavaScript. Le problème semble être là.
la source
request.raw_post_data
est obsolète. Utilisezrequest.body
plutôtla source
Quelque chose comme ça. Cela a fonctionné: demander des données au client
Traiter la demande sur le serveur
la source
la source
En utilisant Angular, vous devez ajouter un en-tête à la demande ou l'ajouter aux en-têtes de configuration du module:
{'Content-Type': 'application/x-www-form-urlencoded'}
la source
request.POST est juste un objet de type dictionnaire, il suffit donc de l'indexer avec la syntaxe dict.
En supposant que votre champ de formulaire est fred, vous pouvez faire quelque chose comme ceci:
Vous pouvez également utiliser un objet de formulaire pour traiter les données POST.
la source