मेरे आने वाले Django अनुरोध में मेरा JSON डेटा कहां है?


162

मैं आने वाली JSON / Ajax अनुरोधों को Django / पायथन के साथ संसाधित करने का प्रयास कर रहा हूं।

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']

अनुरोध पोस्ट कुंजियों में कोई कुंजी नहीं है।

जब मैं Firebug में POST को देखता हूं , तो JSON डेटा अनुरोध में भेजा जाता है।


आप वास्तव में क्या पोस्ट कर रहे हैं? हमें जावास्क्रिप्ट कॉल दिखाएं।
डैनियल रोसमैन जूल

और len(request.POST)और request.POST.items()भी मदद मिलेगी।
विनय साजिप

जवाबों:


233

यदि आप JSON को Django पर पोस्ट कर रहे हैं, तो मुझे लगता है कि आप चाहते हैं request.body( request.raw_post_dataDjango <1.4 पर)। यह आपको पोस्ट के माध्यम से भेजे गए कच्चे JSON डेटा देगा। वहां से आप इसे आगे प्रोसेस कर सकते हैं।

यहां जावास्क्रिप्ट, jQuery , jquery-json और Django का उपयोग करके एक उदाहरण दिया गया है ।

जावास्क्रिप्ट:

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")

कृपया बताएं कि 'टेस्ट क्लाइंट' से आपका क्या अभिप्राय है? तुम क्या करने की कोशिश कर रहे हो?
Jared Knipp

मैं असभ्य होने की कोशिश नहीं कर रहा हूं: "परीक्षण ग्राहक," मेरा मतलब है कि django "परीक्षण ग्राहक।" यदि आप परीक्षण ग्राहक के साथ नहीं हैं तो आप विचारों का परीक्षण कैसे करेंगे?
२०

4
ध्यान रखें: आपको स्लैश (/) चार के साथ url समाप्त करना चाहिए। इसके अलावा CSRF को @csrf_exempt
dani herrera

46
एनबी अगर आप 1.4 का उपयोग कर रहे हैं, तो इसे request.body कहा जाएगा। raw_post_data पदावनत है ...
prauchfuss

3
django unittest के साथ परीक्षण करने के लिए बस करेंself.client.post('/event/save-json/', json.dumps(python_dict), HTTP_X_REQUESTED_WITH='XMLHttpRequest', content_type="application/json")
Guillaume Vincent

67

मुझे भी यही समस्या थी। मैं एक जटिल JSON प्रतिक्रिया पोस्ट कर रहा था, और मैं request.POST शब्दकोश का उपयोग करके अपना डेटा नहीं पढ़ सका।

मेरा JSON POST डेटा था:

//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);

इस मामले में आपको aurealus द्वारा प्रदान की गई विधि का उपयोग करने की आवश्यकता है। रिक्वेस्ट को पढ़ें।

#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")

2
मैं 4 वीं पंक्ति के साथ समस्या कर रहा हूं: json_data = simplejson.loads(request.raw_post_data)क्या आप सुनिश्चित हैं कि सही ढंग से कहा गया है?
wfbarksdale 1

मुझे पूरा यकीन है कि request.raw_post_data सही रूप है क्योंकि मैंने परीक्षण में इस उदाहरण का उपयोग किया था। @Weezybizzle आपके पास किस तरह के मुद्दे हैं?
स्ट्रिकजक्स

1
कुछ अतिरिक्त पाठ में आने वाले डेटा ने इसे भी जोड़ दिया जो पार्सिंग को खराब कर रहा था। तो यह मुझे 100% था।
wfbarksdale 16

4
django.utils.simplejsonहाल के संस्करणों में हटा दिया गया है। बस stdlib jsonलाइब्रेरी का उपयोग करें ।
मार्टिज़न पीटरर्स

आप अनुरोध का उपयोग करना चाहेंगे। Django
1.4+ के

38

विधि 1

ग्राहक: के रूप में भेजें 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}

सर्वर:

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

विधि 2

ग्राहक: के रूप में भेजें x-www-form-urlencoded
(ध्यान दें: contentTypeऔर processDataबदल दिया है, JSON.stringifyकी जरूरत नहीं है)

$.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

सर्वर:

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

1.5+ में बदला: https://docs.djangoproject.com/en/dev/releases/1.5/#non-form-data-in-http-requests

HTTP अनुरोधों में गैर-प्रपत्र डेटा :
request.POST में शीर्ष लेख में गैर-विशिष्ट सामग्री-प्रकार के साथ HTTP अनुरोधों के माध्यम से पोस्ट किए गए डेटा शामिल नहीं होंगे। पूर्व संस्करणों में, मल्टीपार्ट / फॉर्म-डेटा या एप्लिकेशन / x-www-form-urlencoded के अलावा अन्य सामग्री-प्रकारों के साथ पोस्ट किया गया डेटा अभी भी request.POST विशेषता में दर्शाया गया है। इन मामलों के लिए कच्चे POST डेटा का उपयोग करने के इच्छुक डेवलपर्स को इसके बजाय request.body विशेषता का उपयोग करना चाहिए।

शायद संबंधित है


3
1 री -django.http.request.RawPostDataException: You cannot access body after reading from request's data stream
AlxVallejo

24

पायथन 3 को याद रखना महत्वपूर्ण है, तार का प्रतिनिधित्व करने के लिए एक अलग तरीका है - वे बाइट सरणियां हैं।

Django 1.9 और पायथन 2.7 का उपयोग करना और मुख्य शरीर में JSON डेटा भेजना (हेडर नहीं) आप कुछ इस तरह का उपयोग करेंगे:

mydata = json.loads(request.body)

लेकिन Django 1.9 और पायथन 3.4 के लिए आप उपयोग करेंगे:

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

मैं अभी इस सीखने की अवस्था से गुज़रा और अपना पहला Py3 Django ऐप बनाया!


3
आपके विवरण के लिए धन्यवाद! मैं Django 1.10 और पायथन 3.5 का उपयोग कर रहा हूं, mydata = json.loads (request.body.decode ("utf-8") काम करता है!
जूलिया झाओ


9

django पर 1.6 अजगर 3.3

ग्राहक

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

सर्वर

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")))

5

HTTP POST पेलोड बाइट्स का सिर्फ एक सपाट गुच्छा है। Django (अधिकांश रूपरेखाओं की तरह) इसे URL एन्कोडेड मापदंडों या MIME- मल्टीपार्ट एन्कोडिंग के शब्दकोश में डिकोड करता है। यदि आप केवल JSON डेटा को POST सामग्री में डंप करते हैं, तो Django इसे डिकोड नहीं करेगा। या तो JSON पूर्ण POST सामग्री से डिकोडिंग करता है (शब्दकोश नहीं); या JSON डेटा को MIME- मल्टीपार्ट रैपर में रखें।

संक्षेप में, जावास्क्रिप्ट कोड दिखाएं। समस्या तो लगती है।


मुझे अब समस्या दिखाई देती है! Jquery में टाइप = 'json' पैरामीटर से तात्पर्य है कि किस प्रकार की अपेक्षा की जाए, न कि वह जो भेजता है। यह नियमित रूप से पोस्ट एन्कोडेड डेटा भेज रहा है, इसलिए यदि मैं "json" भेजना चाहता हूं, तो मुझे किसी तरह इसे एक स्ट्रिंग में बदलने की जरूरत है, और "json = {foo: bar,}" आदि पास करें, लेकिन मुझे विश्वास नहीं हो रहा है, कि यह है ज्यादातर लोग इसे कैसे करते हैं। मैं यहाँ कुछ मिस कर रहा हूँ।

वास्तव में आप फॉर्म को jQuery स्ट्रिंग में jser में .serialize () फ़ंक्शन के साथ परिवर्तित कर सकते हैं। लेकिन आपको विशेष रूप से json भेजने की आवश्यकता क्यों है, हालांकि? केवल फॉर्म डेटा भेजने में क्या गलत है?
डैनियल रोसमैन जूल

4
ऐसे कई मामले हैं जहां कच्चे फॉर्म का डेटा पर्याप्त नहीं है; JSON आपको पदानुक्रमित वस्तुओं को भेजने की अनुमति देता है, न केवल कुंजी: मूल्य जोड़े। आप नेस्टेड सेट, एरेज़ आदि भेज सकते हैं। आप शायद पोस्ट डेटा के साथ वह सब कर सकते हैं, लेकिन यह उतना सुविधाजनक नहीं है। यह थोड़े से हमेशा JSON के साथ सौदा करने के लिए अच्छा है, दोनों और से
20


4

कुछ इस तरह। यह काम कर रहा है: ग्राहक से डेटा का अनुरोध करें

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);
});

सर्वर पर प्रक्रिया अनुरोध

@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")

2
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

कोणीय का उपयोग करते हुए आपको हेडर जोड़ने या मॉड्यूल कॉन्फ़िगर हेडर में जोड़ने के लिए शीर्षक जोड़ना चाहिए: {'Content-Type': 'application/x-www-form-urlencoded'}

$http({
    url: url,
    method: method,
    timeout: timeout,
    data: data,
    headers: {'Content-Type': 'application/x-www-form-urlencoded'}
})

-4

request.POST केवल एक शब्दकोष जैसी वस्तु है, इसलिए इसे केवल वाक्य रचना के साथ अनुक्रमित करें।

मान लें कि आपका फ़ॉर्म फ़ील्ड फ़्रेड है, तो आप कुछ ऐसा कर सकते हैं:

if 'fred' in request.POST:
    mydata = request.POST['fred']

वैकल्पिक रूप से, POST डेटा से निपटने के लिए एक फॉर्म ऑब्जेक्ट का उपयोग करें।


मैं अनुरोध में देख रहा था ।POST ['json'] जिसमें कुछ भी नहीं था। लेन 0 था

फिर निश्चित रूप से आपके जावास्क्रिप्ट कॉल को देखने में मदद मिलेगी, जैसा कि डैनियल ने सुझाव दिया था।
विनय साजिप

13
request.POST केवल तब पॉप्युलेट किया जाता है जब POST अनुरोध के मुख्य भाग को एनकोड किया जाता है, अन्यथा यह खाली होता है।
स्लिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.