momo's Blog.

在djangorestframework-simplejwt, 获取Token时报错 AttributeError: 'str' object has n...

字数统计: 448阅读时长: 2 min
2021/11/10 Share

原因

接口

1
path('token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),

错误

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Internal Server Error: /api/token/
Traceback (most recent call last):
File "/usr/local/lib/python3.6/site-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/usr/local/lib/python3.6/site-packages/django/core/handlers/base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/usr/local/lib/python3.6/site-packages/django/core/handlers/base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python3.6/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
return view_func(*args, **kwargs)
File "/usr/local/lib/python3.6/site-packages/django/views/generic/base.py", line 71, in view
return self.dispatch(request, *args, **kwargs)
File "/usr/local/lib/python3.6/site-packages/rest_framework/views.py", line 497, in dispatch
response = self.handle_exception(exc)
File "/usr/local/lib/python3.6/site-packages/rest_framework/views.py", line 457, in handle_exception
self.raise_uncaught_exception(exc)
File "/usr/local/lib/python3.6/site-packages/rest_framework/views.py", line 468, in raise_uncaught_exception
raise exc
File "/usr/local/lib/python3.6/site-packages/rest_framework/views.py", line 494, in dispatch
response = handler(request, *args, **kwargs)
File "/usr/local/lib/python3.6/site-packages/rest_framework_simplejwt/views.py", line 27, in post
serializer.is_valid(raise_exception=True)
File "/usr/local/lib/python3.6/site-packages/rest_framework/serializers.py", line 235, in is_valid
self._validated_data = self.run_validation(self.initial_data)
File "/usr/local/lib/python3.6/site-packages/rest_framework/serializers.py", line 433, in run_validation
value = self.validate(value)
File "/usr/local/lib/python3.6/site-packages/rest_framework_simplejwt/serializers.py", line 73, in validate
refresh = self.get_token(self.user)
File "/usr/local/lib/python3.6/site-packages/rest_framework_simplejwt/serializers.py", line 68, in get_token
return RefreshToken.for_user(user)
File "/usr/local/lib/python3.6/site-packages/rest_framework_simplejwt/tokens.py", line 226, in for_user
token=str(token),
File "/usr/local/lib/python3.6/site-packages/rest_framework_simplejwt/tokens.py", line 82, in __str__
return token_backend.encode(self.payload)
File "/usr/local/lib/python3.6/site-packages/rest_framework_simplejwt/backends.py", line 43, in encode
return token.decode('utf-8')
AttributeError: 'str' object has no attribute 'decode'

解决

在官方git上, 发现已经有人提了Issues.

解决方法1. 将PyJWT从2.0.0降级到1.7.1

1
pip install PyJWT==1.7.1

解决方法2. 将djangorestframework-simplejwt升级4.6.0

PS: 阿里的镜像源没有这个版本, 最多是4.4.0

1
djangorestframework-simplejwt==4.6.0

参考

CATALOG
  1. 1. 原因
  2. 2. 解决
    1. 2.1. 解决方法1. 将PyJWT从2.0.0降级到1.7.1
    2. 2.2. 解决方法2. 将djangorestframework-simplejwt升级4.6.0
  3. 3. 参考