简体   繁体   English

Django rest 框架:创建用户请求身份验证

[英]Django rest framework : creating a user ask for authentication

I was using django user, authentication and permission modules but while making a request to create a new user in the POST request, its asking for authentication.我正在使用 django 用户、身份验证和权限模块,但是在 POST 请求中请求创建新用户时,它要求进行身份验证。

在此处输入图片说明

and I am getting我得到

{
    "detail": "Authentication credentials were not provided."
}

Here is my serializers.py这是我的serializers.py

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ['id', 'username', 'password']

        extra_kwargs = {
            'password' : {
                'write_only':True,
                'required': True
            }
        }
    
    def create(self, validated_data):
        user = User.objects.create_user(**validated_data)
        Token.objects.create(user=user) # create token for the user
        return user

    def update(self, instance, validated_data):
        instance.username = validated_data['username']
        instance.set_password(validated_data['password'])
        instance.save()

        return instance

views.py视图.py

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

    permission_classes = [IsAuthenticated, IsOwnerOfObject]
    authentication_classes = (TokenAuthentication,)

urls.py网址.py

from django.urls import path, include
from .views import UserViewSet
from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register('users', UserViewSet, basename = 'users')

urlpatterns = [
    path('api/', include(router.urls)), 
]

It's because permission_classes you set include IsAuthenticated.这是因为您设置的 permission_classes 包含 IsAuthenticated。 If you want to make it public with user creation like below example code, then custom Permission class has to be implemented that allows it.如果您想像下面的示例代码一样通过用户创建将其公开,则必须实现允许它的自定义 Permission 类。


class CustomizedUserPermission(IsAuthenticated):
    def has_permission(self, request, view):
        if view.action == 'create':
            return True
        return super().has_permission(request, view)  
      
class UserViewSet(viewsets.ModelViewSet):
    ...
    permission_classes = [CustomizedUserPermission, ]

updated to override get_permissions class in ViewSet更新以覆盖 ViewSet 中的 get_permissions 类


class UserViewSet(viewsets.ModelViewSet):
    def get_permissions(self): 
        if self.request.action == 'create': 
                return [] 
        return super().get_permissions()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM