Django rest framework : создание запроса пользователя для аутентификации

Я использовал django user, authentication and permission modules, но при выполнении запроса на создание нового пользователя в POST запросе, он просит аутентификацию.

enter image description here

и я получаю

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

Вот мой 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

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

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

urls.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)), 
]

Потому что установленные вами классы разрешений включают IsAuthenticated. Если вы хотите сделать его публичным при создании пользователя, как в приведенном ниже примере, то необходимо реализовать пользовательский класс 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, ]

обновлено для переопределения класса get_permissions в ViewSet


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

Вернуться на верх