Ich versuche, eingehende JSON / Ajax-Anforderungen mit Django / Python zu verarbeiten.
request.is_ajax()
ist True
auf der Anfrage, aber ich habe keine Ahnung, wo sich die Nutzdaten mit den JSON-Daten befinden.
request.POST.dir
enthält dies:
['__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']
Es gibt anscheinend keine Schlüssel in den Anforderungspostschlüsseln.
Wenn ich mir den POST in Firebug ansehe , werden in der Anfrage JSON-Daten gesendet.
len(request.POST)
undrequest.POST.items()
würde auch helfen.Antworten:
Wenn Sie JSON in Django veröffentlichen, möchten Sie dies
request.body
(request.raw_post_data
auf Django <1.4). Dadurch erhalten Sie die per Post gesendeten JSON-Rohdaten. Von dort aus können Sie es weiterverarbeiten.Hier ist ein Beispiel mit JavaScript, jQuery , jquery-json und Django.
JavaScript:
Django:
Django <1,4:
quelle
self.client.post('/event/save-json/', json.dumps(python_dict), HTTP_X_REQUESTED_WITH='XMLHttpRequest', content_type="application/json")
Ich hatte das gleiche Problem. Ich hatte eine komplexe JSON-Antwort gepostet und konnte meine Daten mit dem request.POST-Wörterbuch nicht lesen.
Meine JSON POST-Daten waren:
In diesem Fall müssen Sie die von Aurealus bereitgestellte Methode verwenden. Lesen Sie die request.body und deserialisieren Sie sie mit der json stdlib.
quelle
json_data = simplejson.loads(request.raw_post_data)
Sind Sie sicher, dass dies richtig angegeben ist?django.utils.simplejson
wurde in neueren Versionen entfernt. Verwenden Sie einfach die stdlib-json
Bibliothek.Methode 1
Kunde: Senden als
JSON
Server:
Methode 2
Client: Senden als
x-www-form-urlencoded
(Hinweis:
contentType
&processData
geändert haben,JSON.stringify
wird nicht benötigt)Server:
Geändert in 1.5+: https://docs.djangoproject.com/de/dev/releases/1.5/#non-form-data-in-http-requests
Wahrscheinlich verwandt
quelle
django.http.request.RawPostDataException: You cannot access body after reading from request's data stream
Es ist wichtig, sich daran zu erinnern, dass Python 3 Zeichenfolgen auf andere Weise darstellt - es handelt sich um Byte-Arrays.
Wenn Sie Django 1.9 und Python 2.7 verwenden und die JSON-Daten im Hauptteil (kein Header) senden, verwenden Sie Folgendes:
Aber für Django 1.9 und Python 3.4 würden Sie verwenden:
Ich habe gerade diese Lernkurve durchlaufen und meine erste Py3 Django App erstellt!
quelle
request.raw_response
ist jetzt veraltet. Verwenden Sierequest.body
stattdessen, um nicht konventionelle Formulardaten wie XML-Nutzdaten, Binärbilder usw. zu verarbeiten.Django-Dokumentation zu diesem Thema .
quelle
auf Django 1.6 Python 3.3
Klient
Server
quelle
Die HTTP-POST-Nutzdaten sind nur eine flache Gruppe von Bytes. Django (wie die meisten Frameworks) dekodiert es entweder aus URL-codierten Parametern oder aus MIME-Multipart-Codierung in ein Wörterbuch. Wenn Sie nur die JSON-Daten im POST-Inhalt speichern, wird sie von Django nicht dekodiert. Führen Sie entweder die JSON-Dekodierung aus dem vollständigen POST-Inhalt (nicht aus dem Wörterbuch) durch. oder legen Sie die JSON-Daten in einem MIME-Multipart-Wrapper ab.
Kurz gesagt, zeigen Sie den JavaScript-Code. Das Problem scheint da zu sein.
quelle
request.raw_post_data
wurde veraltet. Verwenden Sierequest.body
stattdessenquelle
Etwas wie das. Es hat funktioniert: Daten vom Client anfordern
Anfrage auf dem Server verarbeiten
quelle
quelle
Mit Angular sollten Sie einen Header hinzufügen, um ihn anzufordern, oder ihn zu Modulkonfigurationsheadern hinzufügen:
{'Content-Type': 'application/x-www-form-urlencoded'}
quelle
request.POST ist nur ein wörterbuchähnliches Objekt, also indizieren Sie es einfach mit der Diktatsyntax.
Angenommen, Ihr Formularfeld ist fred, könnten Sie Folgendes tun:
Verwenden Sie alternativ ein Formularobjekt, um mit den POST-Daten umzugehen.
quelle