Wagtail/Django多帧动态GIF上传失败:格式字符错误求助
问题描述
已按文档要求安装Wagtail及所有依赖(为支持GIF已安装Wand和ImageMagick),但上传多帧GIF时出现错误,低帧GIF可正常使用,怀疑存在未文档化的配置缺失。
错误信息
2022-08-23 10:29:53,630 ERROR [django.request:241] log 73 140094513477440 Internal Server Error: /admin/images/multiple/add/ Traceback (most recent call last): File "/usr/local/lib/python3.8/site-packages/django/core/handlers/exception.py", line 55, in inner response = get_response(request) File "/usr/local/lib/python3.8/site-packages/django/core/handlers/base.py", line 197, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) File "/usr/local/lib/python3.8/site-packages/django/views/decorators/cache.py", line 62, in _wrapped_view_func response = view_func(request, *args, **kwargs) File "/usr/local/lib/python3.8/site-packages/wagtail/admin/urls/__init__.py", line 161, in wrapper return view_func(request, *args, **kwargs) File "/usr/local/lib/python3.8/site-packages/wagtail/admin/auth.py", line 182, in decorated_view response = view_func(request, *args, **kwargs) File "/usr/local/lib/python3.8/site-packages/django/views/generic/base.py", line 84, in view return self.dispatch(request, *args, **kwargs) File "/usr/local/lib/python3.8/site-packages/django/utils/decorators.py", line 46, in _wrapper return bound_method(*args, **kwargs) File "/usr/local/lib/python3.8/site-packages/django/views/decorators/vary.py", line 21, in inner_func response = func(*args, **kwargs) File "/usr/local/lib/python3.8/site-packages/wagtail/admin/views/generic/multiple_upload.py", line 44, in dispatch return super().dispatch(request) File "/usr/local/lib/python3.8/site-packages/wagtail/admin/views/generic/permissions.py", line 36, in dispatch return super().dispatch(request, *args, **kwargs) File "/usr/local/lib/python3.8/site-packages/django/views/generic/base.py", line 119, in dispatch return handler(request, *args, **kwargs) File "/usr/local/lib/python3.8/site-packages/wagtail/admin/views/generic/multiple_upload.py", line 144, in post if form.is_valid(): File "/usr/local/lib/python3.8/site-packages/django/forms/forms.py", line 205, in is_valid return self.is_bound and not self.errors File "/usr/local/lib/python3.8/site-packages/django/forms/forms.py", line 200, in errors self.full_clean() File "/usr/local/lib/python3.8/site-packages/django/forms/forms.py", line 433, in full_clean self._clean_fields() File "/usr/local/lib/python3.8/site-packages/django/forms/forms.py", line 443, in _clean_fields value = field.clean(value, bf.initial) File "/usr/local/lib/python3.8/site-packages/django/forms/fields.py", line 670, in clean return super().clean(data) File "/usr/local/lib/python3.8/site-packages/django/forms/fields.py", line 198, in clean value = self.to_python(value) File "/usr/local/lib/python3.8/site-packages/wagtail/images/fields.py", line 122, in to_python self.check_image_pixel_size(f) File "/usr/local/lib/python3.8/site-packages/wagtail/images/fields.py", line 112, in check_image_pixel_size self.error_messages["file_too_many_pixels"] % (num_pixels), ValueError: unsupported format character ')' (0x29) at index 33
复现步骤
- 安装技术细节中列出的Wagtail及依赖库
- 在全新Wagtail项目中上传多帧GIF即可触发错误
技术细节
依赖版本:
Django>=4.0,<4.1 wagtail>3 wagtail_localize==1.2.1 django-extensions==3.2.0 psycopg2==2.9.3 loglevel==0.1.2 Wand==0.6.10
系统安装命令:
- Ubuntu Server:
sudo apt-get install libmagickwand-dev - 本地MacOS:
brew install imagemagick
解决方案
这个错误是Wagtail 3.x版本的已知bug:file_too_many_pixels错误消息字符串中存在未转义的括号,导致字符串格式化失败。多帧GIF的总像素数(帧数量×单帧像素)触发了像素数检查,进而触发了这个格式化错误。
有两种解决方式:
1. 临时修复:覆盖错误消息
在项目的settings.py中添加以下配置,重新定义正确的错误消息格式:
from wagtail.images.fields import WagtailImageField WagtailImageField.default_error_messages.update({ 'file_too_many_pixels': "图片总像素数超过限制(最大允许 %(max_pixels)s),当前为 %(num_pixels)s", })
2. 永久修复:升级Wagtail
后续版本已修复该问题,直接升级到Wagtail 3.0.1或更高版本即可:
pip install wagtail>=3.0.1 --upgrade
内容的提问来源于stack exchange,提问作者pdiede
相关产品推荐
相关产品推荐

