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 के लिए कई बार क्यों बुलाया गया है, गलत विधि मानों के साथ?
@ केविन ब्रौन हाँ, यह तब होता है जब ब्राउज़ करने योग्य एपीआई का उपयोग होता है। जेएसओएन के रूप में चीजों का अनुरोध करते समय यह _not_ नहीं होता है। – decibyte
... और "JSON के रूप में" मेरा मतलब है कि URL में '? Format = json' जोड़कर, या उचित 'स्वीकार करें' शीर्षलेख द्वारा। – decibyte