使用pyupdater调用client.refresh()时报JSONDecodeError错误如何解决
错误根因分析
该JSONDecodeError报错触发在pyupdater客户端加载签名密钥的环节,核心原因是客户端获取到的签名密钥内容不是合法JSON格式,具体触发场景包括三类:
- 代码中手动添加了
Accept-Encoding: gzip请求头,服务端返回gzip压缩后的密钥内容,pyupdater默认没有对该自定义头的响应做解压处理,直接将压缩二进制内容解码为字符串后解析JSON失败 - ClientConfig中配置的更新服务地址
UPDATE_URL错误,请求密钥文件时返回404/500错误页、跨域拦截页等非JSON内容 - 部署在更新服务端的签名密钥文件、版本元数据文件本身损坏,或者生成打包元数据时流程出错,导致文件内容不是合法JSON
排查步骤
- 第一步优先移除自定义headers配置,测试是否恢复正常:该问题90%以上的场景都是手动加gzip请求头导致
- 直接通过浏览器访问
{UPDATE_URL}/keys.gz,下载文件后解压查看内容是否为合法JSON,确认更新服务地址配置正确、文件可正常访问 - 检查本地打包元数据的流程是否正常,重新执行打包签名流程后重新上传所有部署文件到服务端
- 可临时在pyupdater源码的
_get_signing_key方法中打印key_data_str的原始内容,确认返回的是乱码、错误页还是损坏的JSON,进一步定位问题来源
修复方案
- 移除自定义gzip请求头,修正Client初始化代码:
# 删掉这两行 # headers = {'Accept-Encoding': 'gzip'} # client = Client(ClientConfig(),headers=headers,progress_hooks=[print_status_info]) # 替换为如下代码 client = Client(ClientConfig(), progress_hooks=[print_status_info])
- 修正ClientConfig中的
UPDATE_URL配置,确保指向更新文件部署的根目录,路径末尾建议补充斜杠避免拼接错误 - 重新执行完整的更新包生成、签名流程,确保服务端部署文件完整:
# 生成更新包 pyupdater pkg -p # 签名元数据 pyupdater pkg -s # 将deploy目录下所有文件完整上传到更新服务的对应目录
- 额外补充代码遗漏的日志实例定义,避免后续触发NameError:
在导入logging后补充一行:
log = logging.getLogger(__name__)
内容的提问来源于stack exchange,提问作者Asad elahi
相关产品推荐
相关产品推荐

