gpt4 book ai didi

Django休息框架: Best practices?

转载 作者:行者123 更新时间:2023-12-02 00:39:57 26 4
gpt4 key购买 nike

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

这是完成分离“权限”以更改对象的不同字段的任务的最佳方法吗?或者有没有更好、更Pythonic的方法来完成我目前正在做的事情?

对以下代码的任何和所有批评都被接受,因为我觉得我已经走捷径了。

非常感谢。

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 直接支持它们。您可以安装类似 Django Fine-Grained Permissions 的软件包但您将不得不使用相同的解决方案,因为无法将这些权限传达给 REST API View 。

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

关于Django休息框架: Best practices?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23728009/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com