2013-11-04 2 views
24

मैं Django REST Framework का उपयोग करके एक एपीआई लिख रहा हूं और मुझे आश्चर्य है कि कक्षा आधारित विचारों का उपयोग करते समय प्रति विधि अनुमतियां निर्दिष्ट कर सकते हैं या नहीं।Django REST Framework - प्रति विधियों के अलग-अलग अनुमतियां

Reading the documentation मुझे लगता है कि यदि आप अनुमतियों के साथ रक्षा करना चाहते हैं तो उन दृश्यों के कार्य पर @permission_classes सजावट का उपयोग करके, आप फ़ंक्शन आधारित विचार लिख रहे हैं, तो यह करना आसान है। हालांकि, मुझे APIView कक्षा के साथ सीबीवी का उपयोग करते समय ऐसा करने का कोई तरीका नहीं दिखता है, क्योंकि तब मैं permission_classes विशेषता के साथ पूर्ण श्रेणी के लिए अनुमतियां निर्दिष्ट करता हूं, लेकिन यह तब सभी वर्ग विधियों (get, post पर लागू किया जाएगा) , put ...)।

तो क्या सीबीआई के साथ लिखे गए एपीआई विचारों को देखना संभव है और दृश्य वर्ग की प्रत्येक विधि के लिए अलग-अलग अनुमतियां भी निर्दिष्ट कर सकते हैं?

+0

कैसे के बारे में आपको प्रत्येक के लिए एक अलग दृश्य बनाते हैं? या आप अपने दृश्य में get/post/put विधियों को ओवरराइट कर सकते हैं और अपनी अनुमतियां लिख सकते हैं। –

उत्तर

28

संपूर्ण व्यू क्लास पर अनुमतियां लागू की जाती हैं, लेकिन आप अपने प्राधिकरण निर्णय में अनुरोध के खाते के पहलुओं (जैसे जीईटी या पोस्ट) की जानकारी ले सकते हैं।

एक उदाहरण के रूप में निर्मित देखें IsAuthenticatedOrReadOnly:

SAFE_METHODS = ['GET', 'HEAD', 'OPTIONS'] 

class IsAuthenticatedOrReadOnly(BasePermission): 
    """ 
    The request is authenticated as a user, or is a read-only request. 
    """ 

    def has_permission(self, request, view): 
     if (request.method in SAFE_METHODS or 
      request.user and 
      request.user.is_authenticated()): 
      return True 
     return False 
+0

देरी के लिए खेद है। धन्यवाद, केविन। आपका जवाब सही था। 'IsAuthenticatedOrReadOnly' अनुमति वर्ग है, जो' SAFE_METHODS' का उपयोग कर सकता है। –

+0

बहुत अच्छा, एक पोस्ट-एपीआई एपीआई के लिए भी काम करेगा, तीसरे पक्ष के सहयोगियों द्वारा लीड बनाने के लिए कहेंगे, लेकिन पूरे लीड सूची की सूची को रोकने के लिए? –

33

मैं जब CBV का उपयोग एक ही समस्या का सामना करना पड़ा, जैसा कि मैंने काफी जटिल अनुमतियाँ अनुरोध पद्धति के आधार पर तर्क है।

समाधान मैं के साथ आया था इस पेज के नीचे सूचीबद्ध थर्ड पार्टी 'rest_condition' ऐप्लिकेशन

http://www.django-rest-framework.org/api-guide/permissions

https://github.com/caxap/rest_condition

मैं सिर्फ अनुमतियाँ प्रवाह तर्क इतना है कि विभाजित उपयोग करने के लिए था अनुरोध विधि के आधार पर प्रत्येक शाखा दौड़ जाएगी।

from rest_condition import And, Or, Not 

class MyClassBasedView(APIView): 

    permission_classes = [Or(And(IsReadOnlyRequest, IsAllowedRetrieveThis, IsAllowedRetrieveThat), 
          And(IsPostRequest, IsAllowedToCreateThis, ...), 
          And(IsPutPatchRequest, ...), 
          And(IsDeleteRequest, ...)] 

तो 'या' निर्धारित करता है कि कौन सी अनुमतियां की शाखा अनुरोध विधि और 'और' स्वीकार किए जाते हैं अनुरोध विधि से संबंधित अनुमतियाँ लपेटता है, इसलिए सभी की अनुमति के लिए पारित करना होगा प्रदान किए जाने की के आधार पर चलाना चाहिए। आप और भी जटिल अनुमतियों को बनाने के लिए प्रत्येक प्रवाह के भीतर 'या', 'और' और 'नहीं' मिश्रण भी कर सकते हैं।

प्रत्येक शाखा बस इस तरह दिखना चलाने की अनुमति कक्षाएं,

class IsReadyOnlyRequest(permissions.BasePermission): 

    def has_permission(self, request, view): 
     return request.method in permissions.SAFE_METHODS 


class IsPostRequest(permissions.BasePermission): 

    def has_permission(self, request, view): 
     return request.method == "POST" 


... #You get the idea