Django rest framework : создание запроса пользователя для аутентификации
Я использовал django user, authentication and permission modules, но при выполнении запроса на создание нового пользователя в POST запросе, он просит аутентификацию.
и я получаю
{
"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()