2015-06-05 21 views
9

मैं डीआरएफ के एक दृश्य के लिए निम्न कोड:Django बाकी फ्रेमवर्क: खाली request.data

from rest_framework import viewsets 

class MyViewSet(viewsets.ViewSet): 

    def update(self, request, pk = None): 
     print pk 
     print request.data 

मैं अजगर-अनुरोध निम्नलिखित तरीके से के माध्यम से URL को कॉल:

import requests 
payload = {"foo":"bar"} 
headers = {'Content-type': 'application/json'} 
r = requests.put("https://.../myPk", data= payload, headers=headers) 

लेकिन जब सर्वर से अनुरोध प्राप्त होता है, request.data खाली है। यहां आउटपुट है:

myPk 
<QueryDict: {}> 

मैं इस समस्या को कैसे ठीक कर सकता हूं?

+0

बाकी framwork के दस्तावेज़ का उपयोग कर requests.post – Mikeec3

+0

Mikeec3 प्रयास करें (मैं अपने यूआरएल में बैकस्लैश अनुगामी जिसकी वजह से मैं इस मुद्दे का सामना करना पड़ रहा था याद आ रही थी) कहता है: _request.data अनुरोध निकाय की पार्स की गई सामग्री देता है। यह मानक अनुरोध के समान है। POST और request.FILES गुणों को छोड़कर: - इसमें फ़ाइल और गैर-फ़ाइल इनपुट सहित सभी पार्स की गई सामग्री शामिल है। ** - यह POST के अलावा HTTP विधियों की सामग्री को पार्स करने का समर्थन करता है, जिसका अर्थ है कि आप पुट और पैच अनुरोधों की सामग्री तक पहुंच सकते हैं। ** - यह केवल फॉर्म डेटा का समर्थन करने के बजाय आरईएसटी फ्रेमवर्क के लचीले अनुरोध पार्सिंग का समर्थन करता है। उदाहरण के लिए आप इनकमिंग जेएसओएन डेटा को उसी तरह से संभाल सकते हैं जैसे आप आने वाले फॉर्म डेटा को संभालते हैं ._ – floatingpurr

उत्तर

11

आपको payload को क्रमबद्ध json ऑब्जेक्ट के रूप में भेजने की आवश्यकता है।

*** ParseError: JSON parse error - No JSON object could be decoded 

आप (जैसे pdb या ipdb के साथ) दृश्य डिबगिंग या इस तरह चर मुद्रण द्वारा कि त्रुटि संदेश दिखाई:

import json 
import requests 
payload = {"foo":"bar"} 
headers = {'Content-type': 'application/json'} 
r = requests.put("https://.../myPk/", data=json.dumps(payload), headers=headers) 

अन्यथा क्या होता है कि वास्तव में डीआरएफ शिकायत के बारे में है

def update(self, request, pk = None): 
    print pk 
    print str(request.data) 
+0

मैंने शब्दकोश को जेसन के रूप में क्रमबद्ध करने की कोशिश की लेकिन यह अभी भी काम नहीं कर रहा है। जब मैं विभिन्न मूल्यों के प्रिंट को पढ़ता हूं तो मुझे हमेशा 'myPk' और' 'मिलता है। – floatingpurr

+0

जब आप 'print request.data' के बजाय 'request request.stream.read()' प्रिंट करते हैं तो आपको क्या आउटपुट मिलता है (उस परीक्षण के लिए 'print request.data' को निकालना महत्वपूर्ण है)। यह आपको आपके अनुरोध से अनचाहे कच्चे डेटा दिखाएगा। क्या आप वहां कुछ भी देखते हैं? [डॉक्स में स्ट्रीम] [http://www.django-rest-framework.org/api-guide/requests/#stream) – sthzg

+0

मैंने लाइन 'प्रिंट अनुरोध। स्ट्रीम' जोड़ा।'def अद्यतन के बाद तुरंत() 'पढ़ें (स्वयं, अनुरोध, पीके = कोई नहीं):'। आउटपुट है: 'विशेषता त्रुटि:' noneType 'ऑब्जेक्ट में कोई विशेषता नहीं है' read'' – floatingpurr

1

मान लिया जाये कि आप अनुरोधों का एक नया पर्याप्त संस्करण पर हैं, तुम क्या करने की जरूरत है:

import requests 

payload = {"foo":"bar"} 
r = requests.put("https://.../myPk", json=payload, headers=headers) 

फिर यह आपके लिए पेलोड को उचित रूप से प्रारूपित करेगा और उचित शीर्षलेख प्रदान करेगा। अन्यथा, आप application/x-www-urlformencoded डेटा भेज रहे हैं जो डीआरएफ सही ढंग से पार्स नहीं करेगा क्योंकि आप इसे बताते हैं कि आप JSON भेज रहे हैं। यहाँ

+0

ठीक है, लेकिन मैं 'हेडर = {' सामग्री-प्रकार 'में प्रारूप निर्दिष्ट करता हूं:' application/json '} ' – floatingpurr

2

चेक 2 समस्याएँ: -

  1. JSON प्रारूप उचित है या नहीं।
  2. Url सही है या नहीं

आशा है कि यह मदद करता है

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