2015-02-09 13 views
6

चलें कहते हैं कि मैं इस APIView हैDjango बाकी फ्रेमवर्क APIRequestFactory अनुरोध वस्तु में कोई विशेषता 'query_params'

class Dummy(APIView): 
    def get(self, request): 
     return Response(data=request.query_params.get('uuid')) 

यह परीक्षण करने के लिए, मैं get समारोह

def test_dummy(self): 
    from rest_framework.test import APIRequestFactory 
    factory = APIRequestFactory() 
    request = factory.get('/?uuid=abcd') 
    DummyView().get(request) 
में पारित करने के लिए एक अनुरोध वस्तु बनाने की जरूरत

यह लगभग AttributeError: 'WSGIRequest' object has no attribute 'query_params'

नज़दीक से देखने के बाद, कारखाने एक डीआरएफ संस्करणके बजाय एक WSGIRequest उदाहरण बनाता है शिकायत।

>>> from rest_framework.test import APIRequestFactory 
>>> factory = APIRequestFactory() 
>>> request = factory.get('/') 
>>> request.__class__ 
<class 'django.core.handlers.wsgi.WSGIRequest'> 

उत्तर

10

यह सही है। फिलहाल APIRequestFactoryHttpRequest ऑब्जेक्ट देता है, जो केवल दृश्य परत पर पहुंचने के बाद रीस्ट फ्रेमवर्क Request ऑब्जेक्ट में अपग्रेड हो जाता है।

यह वास्तविक व्यवहार में आपके द्वारा देखे जाने वाले व्यवहार को प्रतिबिंबित करता है, और क्या करता है उदाहरण के साथ सौदा है। जेएसओएन, एक्सएमएल या आपके परीक्षण अनुरोधों के लिए जो भी अन्य सामग्री प्रकार कॉन्फ़िगर किया गया है उसे प्रस्तुत करना।

हालांकि मैं मानता हूँ कि यह आश्चर्य की बात व्यवहार है और कुछ बिंदु पर यह शायद एक Request वस्तु वापस आ जाएगी, और बाकी ढांचे दृश्य यह सुनिश्चित करेंगे कि यह केवल अनुरोध करता है कि HttpRequest के उदाहरण पर Request उन्नयन प्रदर्शन करती है।

क्या आप अपने मामले में क्या करने की जरूरत नहीं बल्कि .get() विधि लागू की तुलना में, वास्तव में कॉल दृश्य है ...

factory = APIRequestFactory() 
request = factory.get('/?uuid=abcd') 
view = DummyView.as_view() 
response = view(request) # Calling the view, not calling `.get()` 
+0

: मैं एक Django वर्ग आधारित दृश्य के अंदर एक serializer का इस्तेमाल किया और इसके बाद के संस्करण अपवाद उल्लेख किया गया। आक्रमण: गैर-ड्रफ अनुरोध serializer संदर्भ/ – patroqueeet

12

टॉम समाधान का संदर्भ लें, DummyView()(request) त्रुटि बढ़ा देंगे:

TypeError: 'DummyView' object is not callable 

इसके बजाय, as_view का उपयोग करना चाहिए जैसा कि आप urls.py में करते हैं:

DummyView.as_view()(request) 

डीआरएफ के as_view डीजेएफ अनुरोध वस्तु को डीआरएफ संस्करण में परिवर्तित करने के लिए method initialize_request का उपयोग करता है। आप की कोशिश के साथ कर सकते हैं:

from rest_framework.views import APIView 
APIView().initialize_request(request) 
>>> <rest_framework.request.Request object at 0xad9850c> 

तुम भी APIClient उपयोग कर सकते हैं परीक्षण चलाने के लिए। यह यूआरएल प्रेषण का भी परीक्षण करता है।

from rest_framework.test import APIClient 
client = APIClient() 
client.post('/notes/', {'title': 'new idea'}, format='json') 
मेरे लिए
+0

पर भेजा गया था वास्तव में हाँ, मैं बेवकूफ हूं - अब मेरा जवाब अपडेट किया गया, धन्यवाद! –

+7

जबकि मैंने टॉम के जवाब को स्वीकार किया क्योंकि यह सीधे मेरे प्रश्न का उत्तर देता है, 'startize_request' संकेत वास्तव में बहुत मदद करता है। –

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