Django Simple JWT导入InvalidAlgorithmError报错求助
问题
使用Python 3.10+最新版Django Simple JWT生成认证令牌时,出现导入错误:
from jwt import InvalidAlgorithmError, InvalidTokenError, algorithms ImportError: cannot import name 'InvalidAlgorithmError' from 'jwt'
完整错误栈:
ad Request: /api/user/r/ [01/Nov/2022 06:31:45] "POST /api/user/r/ HTTP/1.1" 400 62 Internal Server Error: /api/user/r/ Traceback (most recent call last): File "....../env/lib/python3.10/site-packages/django/core/handlers/exception.py", line 55, in inner response = get_response(request) File "....../env/lib/python3.10/site-packages/django/core/handlers/base.py", line 197, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) File "....../env/lib/python3.10/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view return view_func(*args, **kwargs) File "....../env/lib/python3.10/site-packages/django/views/generic/base.py", line 103, in view return self.dispatch(request, *args, **kwargs) File "....../env/lib/python3.10/site-packages/rest_framework/views.py", line 509, in dispatch response = self.handle_exception(exc) File "....../env/lib/python3.10/site-packages/rest_framework/views.py", line 469, in handle_exception self.raise_uncaught_exception(exc) File "....../env/lib/python3.10/site-packages/rest_framework/views.py", line 480, in raise_uncaught_exception raise exc File "....../env/lib/python3.10/site-packages/rest_framework/views.py", line 506, in dispatch response = handler(request, *args, **kwargs) File "....../account/views.py", line 33, in post token = get_tokens_for_user(user) File "....../account/views.py", line 16, in get_tokens_for_user 'refresh': str(refresh), File "....../env/lib/python3.10/site-packages/rest_framework_simplejwt/tokens.py", line 81, in __str__ return self.get_token_backend().encode(self.payload) File "....../env/lib/python3.10/site-packages/rest_framework_simplejwt/tokens.py", line 204, in get_token_backend return self.token_backend File "....../env/lib/python3.10/site-packages/rest_framework_simplejwt/tokens.py", line 197, in token_backend self._token_backend = import_string( File "....../env/lib/python3.10/site-packages/django/utils/module_loading.py", line 30, in import_string return cached_import(module_path, class_name) File "....../env/lib/python3.10/site-packages/django/utils/module_loading.py", line 15, in cached_import module = import_module(module_path) File "/usr/lib/python3.10/importlib/__init__.py", line 126, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1050, in _gcd_import File "<frozen importlib._bootstrap>", line 1027, in _find_and_load File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 688, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 883, in exec_module File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed File "....../env/lib/python3.10/site-packages/rest_framework_simplejwt/state.py", line 1, in <module> from .backends import TokenBackend File "....../env/lib/python3.10/site-packages/rest_framework_simplejwt/backends.py", line 7, in <module> from jwt import InvalidAlgorithmError, InvalidTokenError, algorithms ImportError: cannot import name 'InvalidAlgorithmError' from 'jwt' (....../jwt/__init__.py) [01/Nov/2022 06:31:52] "POST /api/user/r/ HTTP/1.1" 500 159548
触发错误的代码:
from rest_framework_simplejwt.tokens import RefreshToken # manual refresh tokens def get_tokens_for_user(user): refresh = RefreshToken.for_user(user) return { 'refresh': str(refresh), 'access': str(refresh.access_token), }
已尝试按官方文档调整settings.py配置,问题仍未解决。询问如何解决该错误,是否需要手动在__init__.py中添加InvalidAlgorithmError,以及相关配置的正确设置方式。
解决方法
这个错误的核心原因是pyjwt版本与djangorestframework-simplejwt版本不兼容:新版本pyjwt中InvalidAlgorithmError的命名或导入路径发生了变化,但旧版simplejwt仍在尝试导入旧名称。
指定兼容的pyjwt版本
卸载当前pyjwt,安装与simplejwt匹配的版本。例如,对于多数新版本simplejwt,可安装:pip uninstall pyjwt pip install pyjwt==2.4.0也可以直接查看
djangorestframework-simplejwt的官方依赖说明,安装对应要求的版本。禁止手动修改jwt包源码
不要手动修改jwt/__init__.py添加InvalidAlgorithmError,这会破坏第三方库的完整性,后续版本更新时还会引发新问题,绝非根本解决方案。更新simplejwt到最新版
确保使用最新版djangorestframework-simplejwt,它已适配新版pyjwt的导入规则:pip install --upgrade djangorestframework-simplejwt验证settings.py配置
确保simplejwt基础配置正确,示例配置如下:REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_simplejwt.authentication.JWTAuthentication', ), } from datetime import timedelta SIMPLE_JWT = { 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5), 'REFRESH_TOKEN_LIFETIME': timedelta(days=1), 'ROTATE_REFRESH_TOKENS': False, 'BLACKLIST_AFTER_ROTATION': False, 'UPDATE_LAST_LOGIN': False, 'ALGORITHM': 'HS256', 'SIGNING_KEY': SECRET_KEY, 'VERIFYING_KEY': None, 'AUDIENCE': None, 'ISSUER': None, 'JWK_URL': None, 'LEEWAY': 0, 'AUTH_HEADER_TYPES': ('Bearer',), 'AUTH_HEADER_NAME': 'HTTP_AUTHORIZATION', 'USER_ID_FIELD': 'id', 'USER_ID_CLAIM': 'user_id', 'USER_AUTHENTICATION_RULE': 'rest_framework_simplejwt.authentication.default_user_authentication_rule', 'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',), 'TOKEN_TYPE_CLAIM': 'token_type', 'TOKEN_USER_CLASS': 'rest_framework_simplejwt.models.TokenUser', 'JTI_CLAIM': 'jti', 'SLIDING_TOKEN_REFRESH_EXP_CLAIM': 'refresh_exp', 'SLIDING_TOKEN_LIFETIME': timedelta(minutes=5), 'SLIDING_TOKEN_REFRESH_LIFETIME': timedelta(days=1), }
内容的提问来源于stack exchange,提问作者Rajrup Das
相关产品推荐
相关产品推荐

