【问题标题】:Django Rest Framework: Best practices?Django Rest 框架:最佳实践?
【发布时间】:2014-05-18 23:54:30
【问题描述】:

我想知道 Django Rest Framework 的最佳实践。我一直在通过每个用户使用不同的序列化程序(员工与帐户所有者与其他任何人)和 HTTP 方法来限制更改帐户某些属性的访问权限,但我觉得这太不合 Python 了。

这是完成分离“权限”以更改对象的不同字段的任务的最佳方法吗?或者有没有更好、更 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()]

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    如果我正确理解你想要的是每个字段的权限,而不是 Django 或 Django-REST-Framework 直接支持它们。您可以安装像 Django Fine-Grained Permissions 这样的包,但您会被相同的解决方案困住,因为无法将这些权限传达给 REST API 视图。

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

    【讨论】:

      猜你喜欢
      • 2021-10-15
      • 1970-01-01
      • 2015-04-28
      • 1970-01-01
      • 2020-03-22
      • 2013-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多