Фреймворк Django REST выдает мне отсутствие токена csrf, когда я регистрируюсь для запросов POST
я создаю API с использованием django rest framework и django 5.2 когда я отправляю запрос POST, если я вошел в систему, это выдает ошибку отсутствия токена CSRF. но если я выхожу из системы, это дает мне ответ без ошибок. вот мои взгляды на обработку создания пользователя и аутентификации:
@api_view(['POST'])
def signup_view(request):
if not request.user.is_authenticated:
serializer = UserSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
return Response({"detail": "The user is already logged in."}, status=status.HTTP_403_FORBIDDEN)
@api_view(['POST'])
def login_view(request):
if not request.user.is_authenticated:
user = authenticate(**request.data)
print(request.POST)
if not user:
return Response({"detail": "User authentication failed."}, status=status.HTTP_400_BAD_REQUEST)
login(request, user)
return Response({"detail": "Login was succesful."})
return Response({"detail": "The user is already logged in."}, status=status.HTTP_403_FORBIDDEN)
и вот мои взгляды на обработку методов get и post для модели:
class NoteListView(APIView):
def get(self, request):
notes = Note.objects.filter(author=request.user)
serializer = NoteSerializer(notes, many=True)
data = []
for note in serializer.data:
data.append({'title': note['title']})
return Response(data)
def post(self, request):
serializer = NoteSerializer(data=request.data)
serializer.initial_data['author'] = request.user
print("1")
if serializer.is_valid():
print("2")
serializer.save()
print("3")
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
теперь я хочу знать, что я должен сделать, чтобы исправить ошибку отсутствия csrf в этой ситуации.
Я разработал такой же проект, как и вы, и добавил следующие строки в settings.py, чтобы устранить эту проблему.
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'my_app.custom_authentication.CustomJWTAuthentication',
],
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated',
],
}
Затем я определил класс под названием CustomJWTAuthentication. В этом классе вам нужно определить метод под названием authenticate, возвращаемыми значениями которого будут user и token.
class CustomJWTAuthentication(JWTAuthentication):
def authenticate(self, request):
auth = get_authorization_header(request).split()
if not auth or auth[0].lower() != b'bearer':
return None
.
.
.
.
return (user, token)
Затем вам нужно добавить следующие строки в свои представления:
class MyView(APIView):
authentication_classes = [CustomJWTAuthentication]
permission_classes = [IsAuthenticated]
Как только вы это сделаете, элементы управления аутентификацией будут переданы вам, и ошибка отсутствия токена CSRF исчезнет.
Я также рекомендую изменить список вашего промежуточного программного обеспечения, как показано ниже:
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware', # <------------ add this
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]