jwt.decode() 得到了一个意外的关键字参数'verify'



我可以用路由api/令牌生成令牌,但之后我不能使用它。所有功能之前,但现在我有这个错误从django rest框架,我不知道为什么。

File "/home/mathieu/.local/share/virtualenvs/back-aSs_Rzmq/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "/home/mathieu/.local/share/virtualenvs/back-aSs_Rzmq/lib/python3.8/site-packages/django/core/handlers/base.py", line 181, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/mathieu/.local/share/virtualenvs/back-aSs_Rzmq/lib/python3.8/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
return view_func(*args, **kwargs)
File "/home/mathieu/.local/share/virtualenvs/back-aSs_Rzmq/lib/python3.8/site-packages/django/views/generic/base.py", line 69, in view
return self.dispatch(request, *args, **kwargs)
File "/home/mathieu/.local/share/virtualenvs/back-aSs_Rzmq/lib/python3.8/site-packages/rest_framework/views.py", line 509, in dispatch
response = self.handle_exception(exc)
File "/home/mathieu/.local/share/virtualenvs/back-aSs_Rzmq/lib/python3.8/site-packages/rest_framework/views.py", line 469, in handle_exception
self.raise_uncaught_exception(exc)
File "/home/mathieu/.local/share/virtualenvs/back-aSs_Rzmq/lib/python3.8/site-packages/rest_framework/views.py", line 480, in raise_uncaught_exception
raise exc
File "/home/mathieu/.local/share/virtualenvs/back-aSs_Rzmq/lib/python3.8/site-packages/rest_framework/views.py", line 497, in dispatch
self.initial(request, *args, **kwargs)
File "/home/mathieu/.local/share/virtualenvs/back-aSs_Rzmq/lib/python3.8/site-packages/rest_framework/views.py", line 414, in initial
self.perform_authentication(request)
File "/home/mathieu/.local/share/virtualenvs/back-aSs_Rzmq/lib/python3.8/site-packages/rest_framework/views.py", line 324, in perform_authentication
request.user
File "/home/mathieu/.local/share/virtualenvs/back-aSs_Rzmq/lib/python3.8/site-packages/rest_framework/request.py", line 227, in user
self._authenticate()
File "/home/mathieu/.local/share/virtualenvs/back-aSs_Rzmq/lib/python3.8/site-packages/rest_framework/request.py", line 380, in _authenticate
user_auth_tuple = authenticator.authenticate(self)
File "/home/mathieu/.local/share/virtualenvs/back-aSs_Rzmq/lib/python3.8/site-packages/rest_framework_simplejwt/authentication.py", line 40, in authenticate
validated_token = self.get_validated_token(raw_token)
File "/home/mathieu/.local/share/virtualenvs/back-aSs_Rzmq/lib/python3.8/site-packages/rest_framework_simplejwt/authentication.py", line 94, in get_validated_token
return AuthToken(raw_token)
File "/home/mathieu/.local/share/virtualenvs/back-aSs_Rzmq/lib/python3.8/site-packages/rest_framework_simplejwt/tokens.py", line 43, in __init__
self.payload = token_backend.decode(token, verify=verify)
File "/home/mathieu/.local/share/virtualenvs/back-aSs_Rzmq/lib/python3.8/site-packages/rest_framework_simplejwt/backends.py", line 90, in decode
return jwt.decode(
TypeError: decode() got an unexpected keyword argument 'verify'

我遵循简单的jwt示例。

我settings.py

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

And my 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)

看起来问题直接来自django-rest-framework模块,或者可能是我的操作系统有ssl问题。

修复了requirements.txt中PyJWT==2.1.0和djjangorestframeworksimplejwt ==4.8.0的问题:

PyJWT==2.1.0
djangorestframework-simplejwt==4.8.0

可能会注意到PyJWT 2.2.0(发布:2021年10月7日)导致错误。因此,目前在个人项目中固定PyJWT<2.2或PyJWT==2.1.0是一种解决方案,但理想情况下,这将被适当地固定在这里:

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

或在源代码中处理。

问题是在pyJWT版本。尝试降级到2.0.1.

该问题来自新版本2.2.0(参见https://github.com/jpadilla/pyjwt/issues/698)

升级到pyjwt==2.1.0将解决这个问题。