未找到 Wagtail 管理中的图像再现
Image rendition in Wagtail admin not found
我目前正在 Ubuntu Linux 16.04 上的 UWSGI/NGINX 服务器 运行 上进行开发。这几乎与我们在服务器上的设置完全相同(它是 18.04)。我们在两种环境中都使用 Wagtail 2.4 和 Python 3.6。我已经部署了一个站点并从媒体文件夹(从 /media/images 和 media/original_images 文件夹)复制了所有图像。在开发服务器上,我可以很好地编辑每张图片,并且在生产服务器上一切正常(包括网站和管理员),除了少数图片,当我在管理员中并单击在其中一个 view/edit 上,这几个会产生错误。它们不在任何特定的集合中,并且属于不同的类型(jpg、png)。生成的错误是:
[Errno 13] Permission denied:
/sites/site_name/media/images/image_name.original.jpg
按照从在 Wagtail 管理中上传图片到编辑它的流程,我看到,当第一次上传图片时,在 /media/images:
中创建了三个演绎版
- xxxxxx.max-165x165.xxx
- xxxxxx.width-450.xxx
- xxxxxx.width-1440.xxx
然后,当单击图像进行编辑时,xxxxxx.original.xxx 版本将放置在 /media/images 中。在开发服务器上,我没有点击这少数图像来编辑它们,所以 xxxxxx.original.xxx 版本没有放在 /media/images 中。因此,我这样做了,然后将这些 .original 版本上传到生产服务器,我认为,以修复上述错误。然而,现在当我点击一张图片进行编辑时,我得到了同样的错误,除了它现在正在寻找一个带有随机生成的字符串作为名称的一部分的原件:
[Errno 13] Permission denied:
/sites/site_name/media/images/image_name.original_RANDOM-STRING.jpg
每个原始图像都在 /media/original_images 文件夹中,所以我实际上认为它会从那里提取并在 /media/images 中创建 xxxxxxx.original.xxx 版本尝试编辑时。但是,为什么不将 xxxxxx.original.xxx 版本放在 /media/images 文件夹中来修复此错误,为什么它会查找具有随机生成的字符串的版本而不是简单地找到 xxxxxx.original.xxx版本?
每当请求特定尺寸的图像再现时(通常通过 {% image %}
模板标签),Wagtail 会检查 wagtailimages.Rendition
模型(或 custom Rendition model,如果您的项目定义一个)以查看是否存在该源图像和大小规范的现有再现记录。如果存在,则提供该现有图像文件的 URL;如果没有,它将在 wagtailimages.Rendition
.
中生成一个新的图像文件和相应的数据库条目
将文件上传到 /media/images/
而不创建相应的 wagtailimages.Rendition
条目将没有任何效果,因为 Wagtail 会看到没有数据库条目并得出结论,它必须创建一个新的图像文件。然后,在保存该文件时,Django 分配唯一文件名的逻辑将生效,并为新文件提供一个随机文件名,以避免覆盖您放置在那里的文件。
直接解决此问题的方法是,每当您将文件上传到 /media/images/
时,将数据库条目添加到 wagtailimages.Rendition
。但是,更好的办法是修复底层权限错误。我怀疑 Django 无法创建该文件,因为它没有对该目录的写权限 - 有关此问题的修复,请参阅:
Django [Errno 13] Permission denied: '/var/www/media/animals/user_uploads'
和
https://www.adamerispaha.com/2016/12/14/file-permissions-for-django-media-uploads/
我目前正在 Ubuntu Linux 16.04 上的 UWSGI/NGINX 服务器 运行 上进行开发。这几乎与我们在服务器上的设置完全相同(它是 18.04)。我们在两种环境中都使用 Wagtail 2.4 和 Python 3.6。我已经部署了一个站点并从媒体文件夹(从 /media/images 和 media/original_images 文件夹)复制了所有图像。在开发服务器上,我可以很好地编辑每张图片,并且在生产服务器上一切正常(包括网站和管理员),除了少数图片,当我在管理员中并单击在其中一个 view/edit 上,这几个会产生错误。它们不在任何特定的集合中,并且属于不同的类型(jpg、png)。生成的错误是:
[Errno 13] Permission denied:
/sites/site_name/media/images/image_name.original.jpg
按照从在 Wagtail 管理中上传图片到编辑它的流程,我看到,当第一次上传图片时,在 /media/images:
中创建了三个演绎版- xxxxxx.max-165x165.xxx
- xxxxxx.width-450.xxx
- xxxxxx.width-1440.xxx
然后,当单击图像进行编辑时,xxxxxx.original.xxx 版本将放置在 /media/images 中。在开发服务器上,我没有点击这少数图像来编辑它们,所以 xxxxxx.original.xxx 版本没有放在 /media/images 中。因此,我这样做了,然后将这些 .original 版本上传到生产服务器,我认为,以修复上述错误。然而,现在当我点击一张图片进行编辑时,我得到了同样的错误,除了它现在正在寻找一个带有随机生成的字符串作为名称的一部分的原件:
[Errno 13] Permission denied:
/sites/site_name/media/images/image_name.original_RANDOM-STRING.jpg
每个原始图像都在 /media/original_images 文件夹中,所以我实际上认为它会从那里提取并在 /media/images 中创建 xxxxxxx.original.xxx 版本尝试编辑时。但是,为什么不将 xxxxxx.original.xxx 版本放在 /media/images 文件夹中来修复此错误,为什么它会查找具有随机生成的字符串的版本而不是简单地找到 xxxxxx.original.xxx版本?
每当请求特定尺寸的图像再现时(通常通过 {% image %}
模板标签),Wagtail 会检查 wagtailimages.Rendition
模型(或 custom Rendition model,如果您的项目定义一个)以查看是否存在该源图像和大小规范的现有再现记录。如果存在,则提供该现有图像文件的 URL;如果没有,它将在 wagtailimages.Rendition
.
将文件上传到 /media/images/
而不创建相应的 wagtailimages.Rendition
条目将没有任何效果,因为 Wagtail 会看到没有数据库条目并得出结论,它必须创建一个新的图像文件。然后,在保存该文件时,Django 分配唯一文件名的逻辑将生效,并为新文件提供一个随机文件名,以避免覆盖您放置在那里的文件。
直接解决此问题的方法是,每当您将文件上传到 /media/images/
时,将数据库条目添加到 wagtailimages.Rendition
。但是,更好的办法是修复底层权限错误。我怀疑 Django 无法创建该文件,因为它没有对该目录的写权限 - 有关此问题的修复,请参阅:
Django [Errno 13] Permission denied: '/var/www/media/animals/user_uploads' 和 https://www.adamerispaha.com/2016/12/14/file-permissions-for-django-media-uploads/