it-swarm.com.de

Wo sind meine JSON-Daten in meiner eingehenden Django Anfrage?

Ich versuche, eingehende JSON/Ajax-Anfragen 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 Folgendes:

['__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 POST in Firebug anschaue, werden in der Anfrage JSON-Daten gesendet.

144
user122299

Wenn Sie JSON in Django veröffentlichen, möchten Sie wahrscheinlich request.body (request.raw_post_data on Django <1.4). Auf diese Weise erhalten Sie die per Post gesendeten JSON-Rohdaten. Von dort aus können Sie es weiter verarbeiten.

Hier ist ein Beispiel mit JavaScript, jQuery , jquery-json und Django.

JavaScript:

var myEvent = {id: calEvent.id, start: calEvent.start, end: calEvent.end,
               allDay: calEvent.allDay };
$.ajax({
    url: '/event/save-json/',
    type: 'POST',
    contentType: 'application/json; charset=utf-8',
    data: $.toJSON(myEvent),
    dataType: 'text',
    success: function(result) {
        alert(result.Result);
    }
});

Django:

def save_events_json(request):
    if request.is_ajax():
        if request.method == 'POST':
            print 'Raw Data: "%s"' % request.body   
    return HttpResponse("OK")

Django <1.4:

  def save_events_json(request):
    if request.is_ajax():
        if request.method == 'POST':
            print 'Raw Data: "%s"' % request.raw_post_data
    return HttpResponse("OK")
215
Jared Knipp

Ich hatte das gleiche problem Ich hatte eine komplexe JSON-Antwort gesendet und konnte meine Daten mit dem request.POST-Wörterbuch nicht lesen.

Meine JSON POST Daten waren:

//JavaScript code:
//Requires json2.js and jQuery.
var response = {data:[{"a":1, "b":2},{"a":2, "b":2}]}
json_response = JSON.stringify(response); // proper serialization method, read 
                                          // http://ejohn.org/blog/ecmascript-5-strict-mode-json-and-more/
$.post('url',json_response);

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.

#Django code:
import json
def save_data(request):
  if request.method == 'POST':
    json_data = json.loads(request.body) # request.raw_post_data w/ Django < 1.4
    try:
      data = json_data['data']
    except KeyError:
      HttpResponseServerError("Malformed data!")
    HttpResponse("Got json data")
61
stricjux

Methode 1

Client: Senden als JSON

$.ajax({
    url: 'example.com/ajax/',
    type: 'POST',
    contentType: 'application/json; charset=utf-8',
    processData: false,
    data: JSON.stringify({'name':'John', 'age': 42}),
    ...
});

//Sent as a JSON object {'name':'John', 'age': 42}

Server:

data = json.loads(request.body) # {'name':'John', 'age': 42}

Methode 2

Client: Senden als x-www-form-urlencoded
(Hinweis: contentType & processData haben sich geändert, JSON.stringify Wird nicht benötigt)

$.ajax({
    url: 'example.com/ajax/',
    type: 'POST',    
    data: {'name':'John', 'age': 42},
    contentType: 'application/x-www-form-urlencoded; charset=utf-8',  //Default
    processData: true,       
});

//Sent as a query string name=John&age=42

Server:

data = request.POST # will be <QueryDict: {u'name':u'John', u'age': 42}>

In 1.5+ geändert: https://docs.djangoproject.com/en/dev/releases/1.5/#non-form-data-in-http-requests

Nichtformulardaten in HTTP-Anforderungen :
request.POST enthält im Header keine Daten mehr, die über HTTP-Anforderungen mit nicht formularspezifischen Inhaltstypen gesendet wurden. In früheren Versionen wurden Daten, die mit anderen Inhaltstypen als Multipart/Formulardaten oder Application/x-www-form-urlencoded gesendet wurden, immer noch im request.POST-Attribut dargestellt. Entwickler, die in diesen Fällen auf die Rohdaten POST zugreifen möchten, sollten stattdessen das request.body-Attribut verwenden.

Vermutlich verwandt

33
user

request.raw_response ist jetzt veraltet. Verwenden request.body stattdessen nicht konventionelle Formulardaten wie XML-Payloads, Binärbilder usw. verarbeiten.

Django Dokumentation zu diesem Thema .

23
Kevin S Lin

Es ist wichtig, sich daran zu erinnern, dass Python 3 Zeichenfolgen auf andere Weise darstellt - sie sind Byte-Arrays.

Wenn Sie Django 1.9 und Python 2.7) verwenden und die JSON-Daten im Hauptteil (kein Header) senden, verwenden Sie Folgendes:

mydata = json.loads(request.body)

Aber für Django 1.9 und Python 3.4 würden Sie verwenden:

mydata = json.loads(request.body.decode("utf-8"))

Ich habe gerade diese Lernkurve durchlaufen und meine erste Py3 Django App!

16
Richard Cooke

on Django 1.6 python 3.3

klient

$.ajax({
    url: '/urll/',
    type: 'POST',
    contentType: 'application/json; charset=utf-8',
    data: JSON.stringify(json_object),
    dataType: 'json',
    success: function(result) {
        alert(result.Result);
    }
});

server

def urll(request):

if request.is_ajax():
    if request.method == 'POST':
        print ('Raw Data:', request.body) 

        print ('type(request.body):', type(request.body)) # this type is bytes

        print(json.loads(request.body.decode("utf-8")))
9
Rubber Duck

request.raw_post_data ist veraltet. Verwenden request.body stattdessen

5
Andres

Die Nutzlast von HTTP POST ist nur eine flache Menge von Bytes. Django (wie die meisten Frameworks) decodiert es aus URL-codierten Parametern oder MIME-Multipart-Codierung in ein Wörterbuch. Wenn Sie die JSON-Daten nur in den POST -Inhalt kopieren, wird sie von Django nicht dekodiert. Führen Sie entweder die JSON-Dekodierung aus dem gesamten POST -Inhalt durch (nicht aus dem Wörterbuch). Oder fügen Sie die JSON-Daten in einen MIME-Multipart-Wrapper ein.

Kurz gesagt, zeigen Sie den JavaScript-Code. Das Problem scheint da zu sein.

5
Javier

Etwas wie das. Es hat funktioniert: Daten vom Client anfordern

registerData = {
{% for field in userFields%}
  {{ field.name }}: {{ field.name }},
{% endfor %}
}


var request = $.ajax({
   url: "{% url 'MainApp:rq-create-account-json' %}",
   method: "POST",
   async: false,
   contentType: "application/json; charset=utf-8",
   data: JSON.stringify(registerData),
   dataType: "json"
});

request.done(function (msg) {
   [alert(msg);]
   alert(msg.name);
});

request.fail(function (jqXHR, status) {
  alert(status);
});

Anfrage am Server bearbeiten

@csrf_exempt
def rq_create_account_json(request):
   if request.is_ajax():
       if request.method == 'POST':
           json_data = json.loads(request.body)
           print(json_data)
           return JsonResponse(json_data)
   return HttpResponse("Error")
3
Nghia Tu
html code 

file name  : view.html


    <!DOCTYPE html>
    <html>
    <head>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <script>
    $(document).ready(function(){
        $("#mySelect").change(function(){
            selected = $("#mySelect option:selected").text()
            $.ajax({
                type: 'POST',
                dataType: 'json',
                contentType: 'application/json; charset=utf-8',
                url: '/view/',
                data: {
                       'fruit': selected
                      },
                success: function(result) {
                        document.write(result)
                        }
        });
      });
    });
    </script>
    </head>
    <body>

    <form>
        <br>
    Select your favorite fruit:
    <select id="mySelect">
      <option value="Apple" selected >Select fruit</option>
      <option value="Apple">Apple</option>
      <option value="orange">Orange</option>
      <option value="pineapple">Pineapple</option>
      <option value="banana">Banana</option>
    </select>
    </form>
    </body>
    </html>

Django code:


Inside views.py


def view(request):

    if request.method == 'POST':
        print request.body
        data = request.body
        return HttpResponse(json.dumps(data))
2
Rajan Mandanka