मैं अपने विचार पर IsAdminUser अनुमति लागू करना चाहता हूं। मैं इसे allow_classes विशेषता सेट करके करने में सक्षम हूँ:

class UserProfileView(APIView):
    permission_classes = [IsAdminUser,]

    def get(self, request, pk=None):
        ...

हालांकि, अगर मैं डेकोरेटर का उपयोग करके ऐसा करने की कोशिश करता हूं तो यह अप्रभावी प्रतीत होता है और केवल प्रमाणित उपयोगकर्ताओं के लिए जांच करता है।

class UserProfileView(APIView):

    @permission_classes([IsAdminUser])
    def get(self, request, pk=None):
        ...

मैं समझना चाहता हूं कि ऐसा क्यों व्यवहार कर रहा है। क्या मैं गलत हूं? मेरा पर्यावरण विन्यास: पायथन == 3.7.6, Django == 2.2.10, djangorestframework == 3.11.0, django-oauth-toolkit == 1.2.0

0
Abhishek Sahu 26 मार्च 2020, 22:31

1 उत्तर

सबसे बढ़िया उत्तर

यह APIView हैंडलर पर काम करने वाला नहीं है, @permission_classes बस func.permission_classes = permission_classes सेट करता है और फिर @api_view डेकोरेटर APIView-आधारित वर्ग के साथ कार्य करता है। जब APIView किसी हैंडलर को कॉल करता है तो वह उस हैंडलर पर सेट किए गए permission_classes की जांच नहीं करता है, क्योंकि ये जांच initial विधि में की जाती है। यहाँ APIView.dispatch का एक हिस्सा है:

self.initial(request, *args, **kwargs)
# part of initial:
#     self.check_permissions(request)

# Get the appropriate handler method
if request.method.lower() in self.http_method_names:
    handler = getattr(self, request.method.lower(),
                      self.http_method_not_allowed)
else:
    handler = self.http_method_not_allowed

response = handler(request, *args, **kwargs)

यदि आप अलग-अलग हैंडलर (जैसे प्राप्त या पोस्ट) के लिए अलग-अलग अनुमतियाँ लागू करना चाहते हैं, तो आप या तो कर सकते हैं:

  1. अपना स्वयं का अनुमति वर्ग बनाएं और इसे permission_classes में निर्दिष्ट करें
  2. ओवरराइड check_permissions
  3. हैंडलर में अनुमति तर्क डालें
0
awesoon 27 मार्च 2020, 06:16