Django rest framework simple jwt: decode() получил неожиданный аргумент ключевого слова 'verify'

Теперь у меня эта ошибка от django rest framework, и я не знаю почему. До этого все работало нормально.

Я следую примеру simple dango rest simple jwt.

Мой settings.py

REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES": [
        "rest_framework_simplejwt.authentication.JWTAuthentication",
    ],
}

И мой views.py

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
from .models import User
from .serializers import UserSerializer, UserRegistrationSerializer
from django.http import Http404
from rest_framework import status
from django.views.decorators.csrf import csrf_exempt
from django.core.exceptions import ObjectDoesNotExist


class UserList(APIView):
    permission_classes = [IsAuthenticated]

    def get(self):
        users = User.objects.all().exclude(is_staff=True).order_by("id")
        serializer = UserSerializer(users, many=True)
        return Response(serializer.data)

    def post(self, request):
        serializer = UserRegistrationSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


class UserDetail(APIView):
    permission_classes = [IsAuthenticated]

    @csrf_exempt
    def get_object(self, pk):
        try:
            return User.objects.get(pk=pk)
        except ObjectDoesNotExist:
            raise Http404

    @csrf_exempt
    def get(self, request, pk):
        user = self.get_object(pk=pk)
        serializer = UserSerializer(user)
        return Response(serializer.data)

    @csrf_exempt
    def put(self, request, pk):
        user = self.get_object(pk)
        serializer = UserSerializer(user, data=request.data, partial=True)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    @csrf_exempt
    def patch(self, request, pk):
        user = self.get_object(pk)
        serializer = UserSerializer(user, data=request.data, partial=True)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    @csrf_exempt
    def delete(self, request, pk):
        user = self.get_object(pk)
        user.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

Я могу сгенерировать токен с помощью маршрута api/token, но не могу использовать его после. Похоже, что проблема прямо из модуля django-rest-framework или, может быть, моя операционная система с проблемой ssl. Я на linux mint.

Спасибо за помощь.

Кордиали

Проблема заключается в версии pyJWT. Попробуйте понизить ее до 2.0.1.

Исправлена проблема с PyJWT==2.1.0 и djangorestframework-simplejwt==4.8.0 в requirements.txt:

PyJWT==2.1.0
djangorestframework-simplejwt==4.8.0

Можно отметить, что PyJWT 2.2.0 (Выпущен: 7 октября 2021) вызывает ошибку. Поэтому размещение PyJWT<2.2 или альтернативного PyJWT==2.1.0 в личных проектах является обходным решением на данный момент, но в идеале это должно быть либо размещено соответствующим образом здесь:

https://github.com/jazzband/djangorestframework-simplejwt/blob/master/setup.py#L59

или обрабатывается в исходном коде.

Проблема появилась в новом релизе 2.2.0 (см. https://github.com/jpadilla/pyjwt/issues/698)

Переход на версию pyjwt==2.1.0 исправит проблему.

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