Django4.0+Python3.9下webpack_loader报regex未定义TypeError如何解决
问题诱因
该报错和Python 3.9版本本身无关,执行brew upgrade python无法解决问题,核心原因是当前环境安装的django-webpack-loader版本过旧,未适配Django 4.0版本:
- 旧版本(0.7.x及更早稳定版)依赖Django已废弃的内部接口,自动将配置中
IGNORE字段的规则预编译为正则对象,Django 4.0移除了该内部接口后,self.config['ignores']中存储的是未编译的原始字符串、甚至默认空值,并非预期的正则实例,调试时看到的「regex对象未定义」就是迭代时拿到的元素类型不符合预期导致的。 - 旧版本
django-webpack-loader仅适配旧版webpack-bundle-tracker输出的字符串格式chunk列表,新版构建工具输出的chunk为包含路径、hash信息的字典对象,传入正则match()方法时,就会抛出TypeError: expected string or bytes-like object报错。
修复方案
可根据项目实际情况选择以下任意一种方案修复:
- 推荐方案:升级依赖到兼容版本
直接将django-webpack-loader升级至1.0.0及以上正式版,该版本已完成Django 4.0适配,执行命令:
升级后需同步将前端侧的pip install --upgrade django-webpack-loader>=1.0.0webpack-bundle-tracker升级至1.0.0+版本,保证两端bundle数据格式匹配,原有配置无需大幅调整即可正常运行。 - 临时兼容方案:手动补丁修复(无法升级依赖时使用)
定位到报错的python3.9/site-packages/webpack_loader/loader.py文件,重写filter_chunks函数逻辑,手动补全正则编译、chunk类型兼容处理,替换后的代码如下:
补丁生效后需检查import re def filter_chunks(self, chunks): filtered_chunks = [] # 手动编译忽略规则,兼容未自动预编译的场景 compiled_ignores = [] for pattern in self.config.get('ignores', []): if isinstance(pattern, str): compiled_ignores.append(re.compile(pattern)) else: compiled_ignores.append(pattern) for chunk in chunks: # 兼容chunk为字典对象的场景,提取文件名字符串做匹配 chunk_match_val = chunk if isinstance(chunk, str) else chunk.get('name', '') ignore = any(regex.match(chunk_match_val) for regex in compiled_ignores) if not ignore: filtered_chunks.append(chunk) return filtered_chunkssettings.py中WEBPACK_LOADER配置项,确认IGNORE字段值为列表类型,避免传入None等非可迭代对象触发二次报错。
内容的提问来源于stack exchange,提问作者VikR
相关产品推荐
相关产品推荐

