2013-09-24 3 views
21

के रूप में मैं इस तरह एक अनुरोध है:भेजा जा रहा है के बाद डेटा JSON के रूप में django के लिए और नहीं कच्चे सामग्री

$http({ 
    method: 'POST', 
    url: '/url/', 
    data: 'test=data' 
}) 

मेरी Django दृश्यों में:

class SomeClass(View): 
    def get(self, request): 
     return HttpResponse("Hello") 
    def post(self, request): 
     print request.post 
     print request.body 
     return HttpResponse("Done") 

तो जब मैं request.POST मैं मिलता है एक खाली क्वेरी dict: <QueryDict: {}>

लेकिन मेरे request.body है: test=data

तो मेरा मानना ​​है कि django डेटा को url-encoded पैरामीटर के रूप में प्राप्त करता है, न कि शब्दकोश के रूप में।

मैं इस डेटा को JSON/Dict के रूप में कैसे भेजूं या प्राप्त करूं?

+0

कोड सही है? मुझे लगता है कि आपको request.post के बजाय request.POST का उपयोग करना चाहिए। – esauro

+0

'डेटा' के बजाय, 'पैरा' का प्रयास करें और स्ट्रिंग के बजाय ऑब्जेक्ट दें। रेफरी: http://docs.angularjs.org/api/ng.$http#parameters –

उत्तर

44

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

json.loads(request.body) 
+5

मुझे यह समाधान पसंद है क्योंकि मैं एंगुलरजेएस का उपयोग कर सकता हूं क्योंकि इसे काम करने के लिए हैकिंग करने के बजाए इसे डिज़ाइन किया गया था क्योंकि मुझे jQuery के साथ काम करने के लिए उपयोग किया जाता है। – Dustin

+0

सुंदर बेवकूफ विधि। –

+1

यदि आप कोणीय 4 और डीआरएफ का उपयोग कर रहे हैं 'request.data'। –

0

$http सेवा एक जेएस ऑब्जेक्ट की अपेक्षा करता है, स्ट्रिंग नहीं। इस प्रयास करें:

$http({ 
    method: 'POST', 
    url: '/url/', 
    data: {test: 'data'} 
}) 
+0

बस कोशिश की। इसका एक ही परिणाम :( –

14

मेरे मामले में कुछ काम करता है

app.config ($httpProvider) -> 
    ... 
    $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded' 
:

$http({ 
    url: '/url/', 
    method: "POST", 
    data: $.param(params), 
    headers: { 
     'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' 
    } 
}) 

या अधिक अच्छा संस्करण की तरह

और फिर

$scope.save_result = $http.post('/url/', $.param(params)) 

http://www.daveoncode.com/2013/10/17/how-to-make-angularjs-and-django-play-nice-together/

2

मैं zope2 उपयोग कर रहा हूँ जहाँ मैं simplejson इस्तेमाल किया अजगर शब्दकोश के रूप में अनुरोध json डिकोड करने के लिए:

request_dict = simplejson.loads(request.get('BODY','') 

यह सही ढंग से मेरे लिए काम कर रहा है। इस तरह से मैं इसे फॉर्म पोस्ट में परिवर्तित करने के बजाय कोणीय डिफ़ॉल्ट डिफ़ॉल्ट जेसन अनुरोध का उपयोग करने में सक्षम हूं।

+0

मेरे लिए दिन बचाया – Ravi

2

मैं एक डेकोरेटर बनाने के द्वारा एक सा mariodev के समाधान में सुधार:

# Must decode body of angular's JSON post requests 
def json_body_decoder(my_func): 
    def inner_func(request, *args, **kwargs): 
     body = request.body.decode("utf-8") 
     request.POST = json.loads(body) 
     return my_func(request, *args, **kwargs) 
    return inner_func 

@json_body_decoder 
def request_handler(request): 
    # request.POST is a dictionary containing the decoded body of the request 

अब मैं सिर्फ @json_body_decoder डेकोरेटर जब भी मैं एक अनुरोध हैंडलर कि application/json में पोस्ट डेटा के साथ संबंधित बनाने जोड़ें।

1

कोणीय 4 और Django रेस्ट फ्रेमवर्क के लिए json ऑब्जेक्ट प्राप्त करने के लिए request.data का उपयोग करें।

चाहते:

posted_data = request.data

संबंधित मुद्दे