2015-05-19 9 views
6

ModelViewSet का उपयोग करते हुए, get_serializer_class के लिए यह सामान्य है कि एक अनुरोध के लिए एकाधिक बार कहा जा सके, जब ब्राउज़ करने योग्य एपीआई एक्सेस किया जा सके? और यह कि प्रत्येक कॉल के बीच self.method.request का मान बदलता है?डैंजो रेस्ट फ्रेमवर्क: 'get_serializer_class` कई बार बुलाया जाता है, अनुरोध विधि के गलत मूल्य

मैं a small test project to show the behaviour बना लिया है। project/example/views.py में ThingViewSet एक कस्टम get_serializer_class है, जो वर्तमान अनुरोध विधि को प्रिंट करता है।

आप सर्वर शुरू करने और http://127.0.0.1:8000/things/1/ पर जाएँ, तो उत्पादन की तरह कुछ हो जाएगा:

./manage.py runserver 
Performing system checks... 

System check identified no issues (0 silenced). 
May 19, 2015 - 08:51:34 
Django version 1.8.1, using settings 'project.settings' 
Starting development server at http://127.0.0.1:8000/ 
Quit the server with CONTROL-C. 
Method is: GET 
Method is: PUT 
Method is: PATCH 
Method is: PUT 
[19/May/2015 08:51:40]"GET /things/1/ HTTP/1.1" 200 11679 

जाहिर है, get_serializer_class कहा जाता है 4 बार, अलग-अलग मान (GET, PUT, PATCH, PUT) के साथ है, हालांकि केवल एक ही GET अनुरोध किया जाता है।

अजीब बात यह है कि यह आप JSON के रूप में ही उसका अनुरोध नहीं होता है:

./manage.py runserver 
Performing system checks... 

System check identified no issues (0 silenced). 
May 19, 2015 - 10:25:57 
Django version 1.8.1, using settings 'project.settings' 
Starting development server at http://127.0.0.1:8000/ 
Quit the server with CONTROL-C. 
Method is: GET 
[19/May/2015 10:26:22]"GET /things/?format=json HTTP/1.1" 200 49 

और समस्या यह है कि ब्राउज़ करने योग्य एपीआई के get_serializer_class करने के लिए पिछले कॉल में अनुरोध विधि PUT है (जो GET अनुरोध के लिए स्पष्ट रूप से गलत है) और फिर हम अनुरोध के लिए गलत धारावाहिक का उपयोग कर समाप्त करते हैं, यह देखते हुए कि अलग-अलग अनुरोध विधिओं के लिए विभिन्न धारावाहिक वापस लौटाए जाते हैं, जो हम अपने वास्तविक जीवन प्रोजेक्ट (उदाहरण के लिए पढ़ने और लिखने के संचालन के लिए) में करते हैं।

क्या कोई भी क्या हो रहा है पर कुछ प्रकाश डाल सकता है? get_serializer_class को ब्राउज करने योग्य API के लिए कई बार क्यों बुलाया गया है, गलत विधि मानों के साथ?

+0

@ केविन ब्रौन हाँ, यह तब होता है जब ब्राउज़ करने योग्य एपीआई का उपयोग होता है। जेएसओएन के रूप में चीजों का अनुरोध करते समय यह _not_ नहीं होता है। – decibyte

+0

... और "JSON के रूप में" मेरा मतलब है कि URL में '? Format = json' जोड़कर, या उचित 'स्वीकार करें' शीर्षलेख द्वारा। – decibyte

उत्तर

10

कारण है कि आप get_serializer_class बुलाया जा रहा है कई बार देख रहे हैं क्योंकि आप ब्राउज़ करने योग्य एपीआई का उपयोग कर रहे हैं। यदि आप ब्राउज़ करने योग्य API का उपयोग किए बिना इसका परीक्षण करते हैं, उदाहरण के लिए JSON रेंडरर (?format=json या Accept शीर्षलेख) को मजबूर कर, तो आप इसे केवल एक ही देखेंगे।

ब्राउज़ करने योग्य एपीआई धारावाहिक के आधार पर प्रदर्शित रूपों को उत्पन्न करता है, इसलिए get_serializer_class प्रत्येक फॉर्म और संभावित अनुरोध प्रकार के लिए एक बार बुलाया जाता है।

तो पहला अनुरोध, GET मूल धारावाहिक के लिए समझ में आता है जिसका उपयोग प्रतिक्रिया डेटा (विशिष्ट वस्तु, इस मामले में) को संभालने के लिए किया जाता है, अगले तीन ब्राउज़ करने योग्य एपीआई के लिए कस्टम होते हैं। ये कॉल कि ऐसा है, तो निम्न क्रम में हैं, get_serializer को जो आप देख रहे हैं

  1. The raw PUT form (for entering any request body).
  2. The raw PATCH form.
  3. The full PUT form (contains the instance data by default).

methodthe override_method with function जो अनुरोध emulates साथ बदला जा रहा है विधि को ओवरराइड किया जा रहा है, जो आमतौर पर POST अनुरोध में होता है जिसके लिए एक अलग विधि की आवश्यकता होती है।

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