首页 > 解决方案 > 未找到 Wagtail 管理中的图像再现

问题描述

我目前正在运行在 Ubuntu Linux 16.04 上的 UWSGI/NGINX 服务器上进行开发。这几乎是我们在服务器上的确切设置(它是 18.04)。我们在两种环境中都使用 Wagtail 2.4 和 Python 3.6。我已经部署了一个站点并复制了 media 文件夹中的所有图像(来自 /media/images 和 media/original_images 文件夹)。在开发服务器上,我可以很好地编辑每个图像,并且在生产服务器上一切正常(包括站点和管理员),除了在少数图像上,当我在管理员中并单击在其中一个查看/编辑时,这几个会产生错误。它们不在任何特定的集合中,并且具有不同的类型(jpg、png)。产生的错误是:

[Errno 13] Permission denied:
/sites/site_name/media/images/image_name.original.jpg

按照从 Wagtail 管理员上传图片到编辑它的流程,我看到,当首次上传图片时,在 /media/images 中创建了三个再现:

然后,当单击图像以对其进行编辑时,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版本?

标签: wagtail

解决方案


每当请求特定大小的图像再现时(通常通过{% image %}模板标签),Wagtail 会检查wagtailimages.Rendition模型(或自定义 Rendition 模型,如果您的项目定义了一个)以查看是否存在该源图像和大小的现有再现记录规格。如果有,则提供该现有图像文件的 URL;如果没有,它将生成一个新的图像文件和一个对应的数据库条目wagtailimages.Rendition

/media/images/在不创建相应条目的情况下上传文件wagtailimages.Rendition将无效,因为 Wagtail 会看到没有数据库条目并得出结论,它必须创建一个新的图像文件。然后,在保存该文件时,Django 分配唯一文件名的逻辑将生效,并为新文件指定一个随机文件名以避免覆盖您放置在那里的文件名。

因此,直接解决此问题的方法是,wagtailimages.Rendition每当您将文件上传到/media/images/. 但是,更好的想法是修复底层权限错误。我怀疑 Django 无法创建文件,因为它没有对该目录的写权限 - 有关此问题的修复,请参阅:

Django [Errno 13] 权限被拒绝:'/var/www/media/animals/user_uploads'https://www.adamerispaha.com/2016/12/14/file-permissions-for-django-media-uploads/


推荐阅读