2013-04-04 10 views
5

का उपयोग कर फ्लास्क सर्वर पर एक जेसन ऑब्जेक्ट को सही तरीके से कैसे पास करना है, मैं एक जेसन ऑब्जेक्ट पास करना चाहता हूं जिसमें मेरे क्लाइंट से नेस्टेड ऑब्जेक्ट्स को मेरे सर्वर पर पास किया जाए।jquery AJAX

क्लाइंट की तरफ

, मेरे डेटा संरचना इस तरह दिखता है:

var response = {}; 
response['screening'] = '1'; 
response['assistance'] = 'wheelchair access'; 
response['guests'] = {}; 
response['guests']['1'] = {} 
response['guests']['1']['first'] = 'John' 
response['guests']['1']['last'] = 'Smith' 
response['guests']['2'] = {} 
response['guests']['2']['first'] = 'Dave' 
response['guests']['2']['last'] = 'Smith' 

और मेरे ajax कॉल इस तरह दिखता है:

$.ajax({ 
    type: "POST", 
    url: window.location.pathname, 
    data: response 
}).done(function(msg) { 
    alert("Data Saved: " + msg); 
}); 

अपने सर्वर है, जो का उपयोग कर चलाया जाता है के लिए इस डेटा पोस्टिंग के बाद पायथन फ्लास्क, मैं ग्राहक से पोस्ट किए गए निरीक्षण का निरीक्षण करने के लिए request.form ऑब्जेक्ट का उपयोग करता हूं। मैं डेटा चाहते हैं उसी तरह से संरचित किया जाना है, हालांकि, इस सर्वर पर उत्पादन होता है:

ImmutableMultiDict([('guests[1][first]', u'John'), ('screening', u'2'), ('guests[2][last]', u'Smith'), ('guests[2][first]', u'Dave'), ('assistance', u'wheelchair access'), ('guests[1][last]', u'Smith')]) 

आप देख सकते हैं, प्रतिक्रिया [ 'मेहमानों'] वस्तु चपटा हो गया है, और सभी को अपने जैसे बच्चों,:

'मेहमानों [2] [पहले]'

... सिर्फ एक तार, नहीं उनके माता पिता प्रतिक्रिया [ 'मेहमानों'] के तत्व हैं।

क्या मेरे क्लाइंट से डेटा के इस ब्लॉक को मेरे सर्वर पर भेजने और बेहतर तरीके से इसकी संरचना को बनाए रखने का एक बेहतर तरीका है?

धन्यवाद!

उत्तर

11

आप JSON स्ट्रिंग के रूप अपनी वस्तु भेज सकता है:

var data = { 
    screening: '1', 
    assistance: 'wheelchair access', 
    guests: [ 
     { 
      first: 'John', 
      last: 'Smith' 
     }, 
     { 
      first: 'Dave', 
      last: 'Smith' 
     } 
    ] 
}; 

$.ajax({ 
    type: 'POST', 
    url: window.location.href, 
    data: JSON.stringify(response), 
    dataType: 'json', 
    contentType: 'application/json; charset=utf-8' 
}).done(function(msg) { 
    alert("Data Saved: " + msg); 
}); 

और फिर request.json का उपयोग इसे उपयोग करने में।

+0

पूरी तरह से काम करता है! धन्यवाद। एक बात यह है कि, .done() विधि कभी निष्पादित नहीं होती है, भले ही मैं अपने सर्वर पर डेटा देख सकूं, और जब मैं क्रोम देव नेटवर्क टैब की जांच करता हूं, तो इस अनुरोध के लिए एक पोस्ट 200 ओके है। – SeanPlusPlus

+0

उपरोक्त टिप्पणी को कभी भी ध्यान न दें। मुझे सर्वर से मेरी प्रतिक्रिया jsonify करने की जरूरत है। इसके साथ मदद के लिए फिर से धन्यवाद। – SeanPlusPlus

0

क्लाइंट साइड पर, आपको उस जावास्क्रिप्ट ऑब्जेक्ट को जेसन स्ट्रिंग में कनवर्ट करने की आवश्यकता है। ऐसा करने के लिए, तो आप इस का उपयोग कर सकते हैं:

JSON.stringify(my_object) // This will return a string that you can pass in you ajax request 

तो सर्वर साइड पर, आप एक अजगर dictionnary को उस वस्तु कन्वर्ट करने के लिए json मॉड्यूल का उपयोग कर की जरूरत है:

import simplejson 
my_new_object = simplejson.loads(my_json) // my_json is my_object from the client (previously called my_object) 

my_new_object अब एक अजगर dictionnary है , और आप जो भी चाहें कर सकते हैं