2013-03-01 15 views
24

पर 415 के साथ असफल रहा है, मैं आरईएसटी एपीआई के लिए django-rest-framework (नवीनतम) का उपयोग कर रहा हूं, और परीक्षण क्लाइंट में निर्मित डीजेंगो में कुछ परीक्षण मामलों को लागू किया है।django-rest-framework http django 1.5

Django परीक्षण का मामला निम्नलिखित Django संस्करण के साथ ठीक काम कर रहा था < 1,5

self.client.put('/core/accounts/%s/'% self.account.id, 
     data = prepare_dict(self.account), 
     HTTP_AUTHORIZATION=self.token) 

1,5 django करने के लिए उन्नत, सभी परीक्षणों HTTP से संबंधित परीक्षण को छोड़कर गुजर रहे हैं डाल जबकि मुद्दे को देख इस @https://docs.djangoproject.com/en/dev/releases/1.5/#options-put-and-delete-requests-in-the-test-client पाया

यदि आप content_type के बिना PUT अनुरोध में डेटा पैरामीटर का उपयोग कर रहे थे, तो आपको पास करने से पहले अपने डेटा को एन्कोड करना होगा यह परीक्षण क्लाइंट के लिए और content_type तर्क सेट करें।

तो, इस परिवर्तन के साथ अपने परीक्षण अद्यतन और निम्नलिखित की कोशिश की, लेकिन अभी भी http 415 के बजाय http 200

from django.test.client import MULTIPART_CONTENT, BOUNDARY, encode_multipart 
self.client.put('/core/accounts/%s/'% self.account.id, 
      data = encode_multipart(BOUNDARY, prepare_dict(self.account)), 
       content_type=MULTIPART_CONTENT, 
     HTTP_AUTHORIZATION=self.token) 

किसी भी विचार है कि मैं क्या याद कर रहा हूँ मिल रहा है? पीएस: सभी कार्यक्षमता डीजेंगो-रेस्ट-फ्रेमवर्क से निर्मित काम कर रही है वेब यूआई

उत्तर

32

आप बिल्कुल सही रास्ते पर हैं - उस मामले में तोड़ने का परीक्षण निश्चित रूप से PUT परीक्षण में Django के परिवर्तन के कारण है ग्राहक।

आपका फिक्स मुझे भी सही लगता है। 415 "असमर्थित मीडिया प्रकार" प्रतिक्रिया है, जिसका अर्थ है कि अनुरोध सामग्री प्रकार ऐसा कुछ नहीं था जिसे दृश्य के लिए कॉन्फ़िगर किए गए किसी भी पार्स द्वारा नियंत्रित किया जा सके।

आम तौर पर इस तरह के मामले में, कि अनुरोध की सामग्री प्रकार सेट करने में भूल की वजह से होगा, लेकिन ऐसा लगता है कि आप मिल गया है की तरह multipart/form-data; boundary=...

दोहरी जांच करने के लिए चीजें है कि सही तरीके से सेट:

  • वास्तव में response.data त्रुटि विवरण के रूप में प्रदर्शित करता है?
  • आपके पास DEFAULT_PARSER_CLASSES सेटिंग में कॉन्फ़िगर किया गया है, यदि आपके पास कोई है, या आपने व्यू विशेषता parser_classes पर सेट किया है, तो उसके पास क्या है?
  • सुनिश्चित करें कि परीक्षण में content_type में कोई टाइपो नहीं है (भले ही यह यहां सही है)।

संपादित:

अपनी टिप्पणी के लिए धन्यवाद - कि सब कुछ साफ करता है अप। आपको केवल JSON पार्सर इंस्टॉल किया गया है, लेकिन आप फॉर्म एन्कोडेड डेटा भेजने की कोशिश कर रहे हैं। आप या तो चाहिए:

  • अपनी सेटिंग्स/दृश्य पर FormParser और MultiPartParser जोड़ें, इतना है कि यह रूप एन्कोडिंग का समर्थन करता है।(यह भी ध्यान रखें कि डिफ़ॉल्ट DEFAULT_PARSER_CLASSES की स्थापना , उन्हें शामिल है कि आप उसके अपेक्षा के अनुरूप काम करेंगे सब पर कुछ भी निर्धारित नहीं करते हैं, इसलिए यदि)

या

  • एनकोड अनुरोध का उपयोग json एन्कोडिंग, आपके परीक्षण मामले में data=json.dumps(prepare_dict(self.account)), content_type='application/json' फॉर्म एन्कोडिंग नहीं।
+1

टॉम, डीजेनागो-रेस्ट-फ़्रेमवर्क के लिए सभी धन्यवाद। जैसा कि आपने पूछा है कि मैंने दो बार चेक किया है। respond.data = {u'detail ': u "असमर्थित मीडिया प्रकार' मल्टीपार्ट/फॉर्म-डेटा; सीमा = अनुरोध में BoUnDaRyStRiNg '}} 2. डिफ़ॉल्ट पार्सर' rest_framework.parsers.JSONParser 'पर सेट है 3. कोई पार्सर_क्लास दृश्य के रूप में नहीं विशेषता। –

+0

सेट के लिए parser_classes = (JSONParser,) सेट करें, लेकिन कोई फर्क नहीं पड़ता –

+1

ठीक है, सेटिंग से default_parser (JSON) को हटाकर जादू किया गया। ढांचे में खुदाई, [email protected] parser = self.negotiator.select_parser (self, self.parsers) में यह पंक्ति उचित पार्सर पर बातचीत करने में असमर्थ है, जब डिफ़ॉल्ट पार्सर (JSON) सेट किया गया है और सामग्री-प्रकार 'multipart/form है -डाटा ' –

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