gpt4 book ai didi

python - 在 View 集中创建的 Django-rest-framework 权限

转载 作者:太空狗 更新时间:2023-10-29 17:24:11 25 4
gpt4 key购买 nike

我正在尝试创建一个 REST API,但在用户注册时卡住了:基本上我需要在注册前获得访问 token 。

这是 View :

class UserViewSet(viewsets.ModelViewSet):

"""
API endpoint that allows users to be viewed or edited.
"""
queryset = User.objects.all()
serializer_class = UserSerializer

def metadata(self, request):
"""
Don't include the view description in OPTIONS responses.
"""
data = super(UserViewSet, self).metadata(request)
return data

def create(self, request):
serializer = self.get_serializer(data=request.DATA, files=request.FILES)

if serializer.is_valid():
self.pre_save(serializer.object)
self.object = serializer.save(force_insert=True)
self.post_save(self.object, created=True)
self.object.set_password(self.object.password)
self.object.save()
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED,
headers=headers)

return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

这是解决方法:

@api_view(['POST'])
@permission_classes((AllowAny,))
@csrf_exempt
def create_auth(request, format=None):
data = JSONParser().parse(request)
serialized = UserSerializer(data=data)

if serialized.is_valid():
user = User.objects.create_user(
serialized.init_data['email'],
serialized.init_data['username'],
serialized.init_data['password'],
)
user.groups = serialized.init_data['groups']

user.save()

serialized_user = UserSerializer(user)
return Response(serialized_user.data, status=status.HTTP_201_CREATED, headers={"Access-Control-Allow-Origin": "http://127.0.0.1:8000/"})
else:
return Response(serialized._errors, status=status.HTTP_400_BAD_REQUEST, headers={"Access-Control-Allow-Origin": "http://127.0.0.1:8000/"})

我的问题是:如何在 UserViewSet 中指定创建不需要凭据?或者指定自定义身份验证方法?我不想更改整个 View 集的身份验证/权限类。

谢谢,阿迪

编辑澄清一下:未注册的用户应该被允许发布注册数据,而不应该被允许做任何其他事情。经过身份验证的用户可以获得用户列表并更新他们自己的个人资料......这是默认行为。这就是为什么 AllowAny 不是一个选项。在我看来,正确的位置是 create 函数,但我没有得到我应该重写的内容。

最佳答案

自定义 get_queryset 方法:

def get_queryset(self):
if self.request.user.is_superuser:
return User.objects.all()
else:
return User.objects.filter(id=self.request.user.id)

这样,经过身份验证的用户只能检索、修改或删除自己的对象。

指定 permission_classes = (AllowAny,) 以便经过身份验证的用户可以创建一个新的。

编辑:来自评论的进一步解释

以这种方式自定义 get_queryset 方法意味着以下内容:

  1. 是的,未经身份验证的用户可以发送 GET 请求来检索用户列表,但它将是空的,因为返回的 User.objects.filter(id=self.request.user.id) 确保只有信息返回经过身份验证的用户。

  2. 这同样适用于其他方法,如果经过身份验证的用户试图删除另一个用户对象,将返回一个详细信息:未找到(因为它试图访问的用户不在查询集中)。

  3. 经过身份验证的用户可以对他们的用户对象做任何他们想做的事情。

关于python - 在 View 集中创建的 Django-rest-framework 权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22760191/

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