Регистрация пользователей возвращает ошибку отсутствия действия атрибута
У меня есть API, обрабатывающий процесс входа и регистрации (Django на React front end). В то время как пользователи могут войти в систему, получая токен доступа и обновления, когда я указываю на конечную точку регистрации, я получаю ошибку
'RegisterApi' object has no attribute 'action'
Вот разбивка моего кода api.py:
from rest_framework import generics, permissions, mixins
from rest_framework.response import Response
from .serializers import RegisterSerializer, UserSerializer
from django.contrib.auth.models import User
from rest_framework.permissions import AllowAny
#Register API
class RegisterApi(generics.GenericAPIView):
serializer_class = RegisterSerializer
def post(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
user = serializer.save()
return Response({
"user": UserSerializer(user, context=self.get_serializer_context()).data,
"message": "User Created Successfully. Now perform Login to get your token",
})
#allow for anonymous signup
def get_permissions(self):
if self.action == 'create':
return [AllowAny()]
else:
return super().get_permissions()
def get_authenticators(self):
if self.action == 'create':
return []
else:
return super().get_authenticators()
serializers.py
from django.contrib.auth.models import User
from rest_framework import serializers
#added more imports based on simpleJWT tutorial
from rest_framework.permissions import IsAuthenticated
from django.db import models
from django.contrib.auth import authenticate
from django.contrib.auth.hashers import make_password
#changed from serializers.HyperLinked to ModelSerializer
class RegisterSerializer(serializers.ModelSerializer):
class Meta:
model = User
#removed url from fields
fields = ['username', 'email', 'password']
extra_kwargs = {
'password': {'write_only': True},
}
def create(self,validated_data):
user = User.objects.create_user(validated_data['username'],
password=validated_data['password'],
email=validated_data['email'])
return user
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = '__all__'
class UserSerializerWithToken(serializers.ModelSerializer):
token = serializers.SerializerMethodField()
password = serializers.CharField(write_only=True)
class PasswordSerializer(serializers.Serializer):
"""
Serializer for password change endpoint.
"""
old_password = serializers.CharField(required=True)
new_password = serializers.CharField(required=True)
urls.py:
from django.contrib import admin
from django.urls import path, include
from rest_framework import routers
from . import views
from rest_framework_simplejwt.views import (TokenObtainPairView, TokenRefreshView, TokenVerifyView)
from .api import RegisterApi
router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)
# router.register(r'groups', views.GroupViewSet)
urlpatterns = [
path('', include(router.urls)),
path('admin/', admin.site.urls),
path('api-auth/', include('rest_framework.urls', namespace='rest_framework')),
path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
path('api/token/verify/', TokenVerifyView.as_view(), name='token_verify'),
path('api/register', RegisterApi.as_view()),
]
и views.py:
from django.contrib.auth.models import User, Group
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework import viewsets, status
from rest_framework import permissions
from .serializers import RegisterSerializer, PasswordSerializer
from rest_framework.permissions import AllowAny
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all().order_by('-date_joined')
#changed name from UserSerializer to RegisterSerializer
serializer_class = RegisterSerializer
# permission_classes = [permissions.IsAuthenticated]
@action(detail=True, methods=['POST'])
def set_password(self, request, pk=None):
user = self.get_object()
serializer = PasswordSerializer(data=request.data)
if serializer.is_valid():
user.set_password(serializer.validated_data['new_password'])
user.save()
return Response({'status': 'password set'})
else:
return Response(serializer.errors,
status=status.HTTP_400_BAD_REQUEST)
Это конечная точка URL, которую я использую api/register