当前位置 博文首页 > 小龙狗的博客:DjangoRestFramework-simplejwt中‘str‘ object

    小龙狗的博客:DjangoRestFramework-simplejwt中‘str‘ object

    作者:[db:作者] 时间:2021-06-23 18:16

    问题描述

    • Python v3.6.6
    • Django v3.2.4
    • djangorestframework v3.12.4
    • djangorestframework-simplejwt v4.4.0

    运行 runserver 命令后测试接口时后台打印错误如下

    Traceback (most recent call last):
      File "D:\Program Files\Python36\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
        response = get_response(request)
      File "D:\Program Files\Python36\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
        response = wrapped_callback(request, *callback_args, **callback_kwargs)
      File "D:\Program Files\Python36\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
        return view_func(*args, **kwargs)
      File "D:\Program Files\Python36\lib\site-packages\django\views\generic\base.py", line 70, in view
        return self.dispatch(request, *args, **kwargs)
      File "D:\Program Files\Python36\lib\site-packages\rest_framework\views.py", line 509, in dispatch
        response = self.handle_exception(exc)
      File "D:\Program Files\Python36\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
        self.raise_uncaught_exception(exc)
      File "D:\Program Files\Python36\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
        raise exc
      File "D:\Program Files\Python36\lib\site-packages\rest_framework\views.py", line 506, in dispatch
        response = handler(request, *args, **kwargs)
      File "D:\Program Files\Python36\lib\site-packages\rest_framework_simplejwt\views.py", line 27, in post
        serializer.is_valid(raise_exception=True)
      File "D:\Program Files\Python36\lib\site-packages\rest_framework\serializers.py", line 220, in is_valid
        self._validated_data = self.run_validation(self.initial_data)
      File "D:\Program Files\Python36\lib\site-packages\rest_framework\serializers.py", line 422, in run_validation
        value = self.validate(value)
      File "D:\Program Files\Python36\lib\site-packages\rest_framework_simplejwt\serializers.py", line 75, in validate
        data['refresh'] = str(refresh)
      File "D:\Program Files\Python36\lib\site-packages\rest_framework_simplejwt\tokens.py", line 82, in __str__
        return token_backend.encode(self.payload)
      File "D:\Program Files\Python36\lib\site-packages\rest_framework_simplejwt\backends.py", line 43, in encode
        return token.decode('utf-8')
    AttributeError: 'str' object has no attribute 'decode'
    

    解决办法

    方法1

    升级 djangorestframework-simplejwt 版本至 4.6.0+

    方法2

    打开
    D:\Program Files\Python36\lib\site-packages\rest_framework_simplejwt\backends.py

    文件,编辑第43行。将

    return token.decode('utf-8')
    

    修改为如下即可

    return token
    

    说明

    这是 Python3 相对 Python2 的升级,关于这个问题可参考

    • AttributeError: ‘str‘ object has no attribute ‘decode‘