2014-05-18 9 views
6

जब मैं Django Rest Framework की बात करता हूं तो मैं सर्वोत्तम प्रथाओं के बारे में सोच रहा था। मैं प्रति उपयोगकर्ता अलग-अलग धारावाहिकों (कर्मचारियों बनाम खाता मालिक बनाम किसी और) और HTTP विधि के उपयोग के माध्यम से किसी खाते पर कुछ विशेषताओं को बदलने के लिए पहुंच सीमित कर रहा हूं, लेकिन मुझे लगता है कि यह बहुत अवांछित है।Django आराम फ्रेमवर्क: सर्वोत्तम प्रथाओं?

क्या यह किसी ऑब्जेक्ट के विभिन्न फ़ील्ड को बदलने के लिए "अनुमतियां" को अलग करने का अपना काम पूरा करने का सबसे अच्छा तरीका है? या क्या वर्तमान में इस तरीके से मैं जो कर रहा हूं उसे पूरा करने के लिए एक बेहतर और अधिक पागल तरीका है?

नीचे दिए गए कोड के साथ कोई भी और सभी आलोचना स्वीकार की जाती है, क्योंकि मुझे लगता है कि मैंने कुछ कोनों को काट दिया है।

बहुत बहुत धन्यवाद।

from rest_framework import serializers, viewsets 
from rest_framework.permissions import SAFE_METHODS 
from accounts.models import User 
from cpapi.permissions import * 


class UserSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = User 
     fields = ('id', 'url', 'username', 'password') 
     write_only_fields = ('password',) 

    def restore_object(self, attrs, instance=None): 
     user = super(UserSerializer, self).restore_object(attrs, instance) 
     if 'password' in attrs.keys(): 
      user.set_password(attrs['password']) 
     return user 

class UserDetailsSerializer(UserSerializer): 
    class Meta(UserSerializer.Meta): 
     fields = ('id', 'url', 'username', 'password', 'email') 

class UserListSerializer(UserSerializer): 
    class Meta(UserSerializer.Meta): 
     fields = ('id', 'url', 'username') 

class UserWithoutNameSerializer(UserSerializer): 
    class Meta(UserSerializer.Meta): 
     fields = ('id', 'url', 'password', 'email') 


class UserViewSet(viewsets.ModelViewSet): 
    """ 
    API endpoint that allows users to be viewed or edited. 
    """ 
    serializer_class = UserSerializer 
    model = User 

    def get_serializer_class(self): # Modify to allow different information for different access (userlist vs staff) 
     serializer_class = self.serializer_class 
     if 'List' in self.get_view_name(): 
      serializer_class = UserListSerializer 
     elif self.request.method in ['PUT', 'PATCH']: 
      serializer_class = UserWithoutNameSerializer 
     elif self.get_object() == self.request.user or self.request.user.is_staff: 
      serializer_class = UserDetailsSerializer 
     return serializer_class 

    def get_permissions(self): 
     if self.request.method in SAFE_METHODS or self.request.method == 'POST': 
      return [AllowAny()] 
     elif self.request.method == 'DELETE': 
      return [IsAdminUser()] 
     else: 
      return [IsStaffOrTargetUser()] 

उत्तर

1

अगर मैं सही ढंग से समझ क्या आप चाहते हैं प्रति फ़ील्ड अनुमतियाँ है, और Django और न ही Django-बाकी-फ्रेमवर्क उन्हें सीधे समर्थन करता है, नहीं। आप Django Fine-Grained Permissions जैसे पैकेज को इंस्टॉल कर सकते हैं लेकिन आप उसी समाधान से फंस जाएंगे क्योंकि REST API व्यू में उन अनुमतियों को कम करने का कोई तरीका नहीं है।

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

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