2014-05-18 26 views
6

Tôi đã tự hỏi về thực tiễn tốt nhất khi nói đến Django Rest Framework. Tôi đã hạn chế quyền truy cập vào việc thay đổi các thuộc tính nhất định trên tài khoản thông qua việc sử dụng các trình tuần tự khác nhau cho mỗi người dùng (nhân viên so với chủ sở hữu tài khoản so với bất kỳ ai khác) và phương pháp HTTP, nhưng tôi cảm thấy như thế này quá khó hiểu.Django Rest Framework: Các phương pháp hay nhất?

Đây có phải là cách tốt nhất để hoàn thành nhiệm vụ tách "quyền" của tôi để thay đổi các trường khác nhau của đối tượng không? Hoặc là có một cách tốt hơn và nhiều hơn nữa pythonic để thực hiện những gì tôi đang làm theo cách này hiện nay?

Bất kỳ và tất cả những lời chỉ trích với mã bên dưới đều được chấp nhận, vì tôi cảm thấy như tôi đã cắt một số góc.

Cảm ơn rất nhiều.

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()] 

Trả lời

1

Nếu tôi hiểu đúng những gì bạn muốn cho phép mỗi lĩnh vực là, và không Django cũng không Django-REST Khung hỗ trợ trực tiếp. Bạn có thể cài đặt một gói như Django Fine-Grained Permissions nhưng bạn sẽ bị mắc kẹt với cùng một giải pháp vì không có cách nào để trao đổi các quyền đó cho khung nhìn REST API.

Tôi khuyên bạn nên gắn bó với giải pháp của bạn hoặc đặt logic lựa chọn bộ nối tiếp trong một bộ nối tiếp có tất cả các trường và chuyển vai trò tới hàm tạo và cho phép trình nối tiếp tạo danh sách trường theo nó, nhưng để làm việc đó bạn sẽ cần phải viết phân lớp Serializer của riêng bạn.

Các vấn đề liên quan