Django Rest Framework:最佳做法?

布拉德·雷登

我在想关于Django Rest Framework的最佳做法。我一直在限制通过使用每个用户使用不同的序列化程序(工作人员vs.帐户所有者vs.其他任何人)和HTTP方法来更改帐户中某些属性的权限,但是我感觉这太不合逻辑了。

这是完成我的任务的最佳方法,该任务分离出“权限”以更改对象的不同字段吗?还是有一种更好和更Python化的方式来完成我目前以这种方式所做的事情?

对以下代码的任何批评都可以接受,因为我觉得自己已经犯了一些错误。

非常感谢。

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

如果我正确理解,您想要的是每个字段的权限,而Django和Django-REST-Framework都不直接支持它们。您可以安装像Django Fine-Grained Permissions这样的软件包,但由于无法将这些权限与REST API视图进行通信,因此您将受制于同一解决方案。

我建议您坚持使用解决方案,或者将序列化程序选择逻辑放在具有所有字段的一个序列化程序中,然后将角色传递给构造函数,然后让序列化程序根据它来构建字段列表,但是为此工作,您将需要编写自己的Serializer子类。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章