安装PyJWT 2.4.0后import jwt提示无法解析导入模块问题
问题原因
触发报错的核心原因分两类,还有一个隐藏的版本兼容问题会在导入修复后触发运行错误:
- 依赖安装错误/冲突:最常见的情况是装了名为
jwt的废弃第三方包,而非官方的PyJWT;或是本地虚拟环境未激活、IDE解释器选错、环境中残留旧版本PyJWT/python-jose等同功能依赖导致解析冲突;Docker场景下多是requirements.txt未正确声明PyJWT版本,或是构建镜像时用了缓存导致依赖未正确安装。 - API版本不兼容:PyJWT 2.0及以上版本调整了返回值类型,
jwt.encode()直接返回字符串而非1.x版本的字节对象,你现有代码末尾的.decode('utf-8')调用在2.4.0版本下会抛出属性错误。
修复方案
1. 清理冲突依赖,安装正确版本
先卸载所有冲突包:
pip uninstall -y jwt PyJWT python-jose
重装指定版本的官方PyJWT包:
pip install PyJWT==2.4.0
确认requirements.txt中明确写入PyJWT==2.4.0,注意包名不要写错成jwt。如果是IDE报导入解析错误,手动切换Python解释器到你安装依赖的虚拟环境即可。
2. 修正JWT生成代码适配2.4.0版本
移除多余的decode调用,修改后的函数代码如下:
import jwt import datetime from django.conf import settings def generate_access_token(user): payload = { 'user_id':user.id, 'exp':datetime.datetime.utcnow() + datetime.timedelta(minutes=60), 'iat' : datetime.datetime.utcnow() } return jwt.encode(payload, settings.SECRET_KEY, algorithm='HS256')
3. Docker部署场景校验
原有Dockerfile逻辑没有问题,重新构建镜像时加无缓存参数避免旧依赖层残留:
docker build --no-cache -t django-jwt-app .
如果容器启动仍报导入错误,进入容器执行pip list | grep PyJWT,确认包版本为2.4.0即可。
内容的提问来源于stack exchange,提问作者Hamza Nasri
相关产品推荐
相关产品推荐

