代码之家  ›  专栏  ›  技术社区  ›  Dan Swain

未找到wagtail admin中的图像格式副本

  •  1
  • Dan Swain  · 技术社区  · 7 年前

    我目前正在运行Ubuntu Linux 16.04的Uwsgi/nginx服务器上开发。这几乎是我们在服务器上的设置(它是18.04)。我们在这两个环境中都使用了wagtail 2.4和python 3.6。我已经部署了一个站点并从媒体文件夹(从/media/images和media/original_images文件夹)复制了所有图像。在dev服务器上,我可以编辑每个映像,并且在生产服务器上(包括站点和管理员)一切都正常工作,除了在少数映像上,当我在管理中并单击其中一个来查看/编辑时,这几个映像会生成一个错误。它们不在任何特定的集合中,并且具有不同的类型(JPG、PNG)。生成的错误是:

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

    按照在wagtail管理中上载图像到编辑图像的流程,我看到,首次上载图像时,在/media/images中创建三个格式副本:

    • 最大值-165x165.xxx
    • 宽-450.XXX
    • 宽-1440.xxx

    然后,单击图像进行编辑时,将在/media/images中放置xxxx.original.xxx版本。在dev服务器上,我没有单击这几张图片来编辑它们,因此xxxx.original.xxx版本没有放在/media/images中。因此,我做了这个,然后上传了这些原始版本到生产服务器,我想,可以修复上面的错误。但是,现在,当我单击一个图像进行编辑时,我会得到相同的错误,只是它现在正在查找一个原始图像,其中包含一个随机生成的字符串作为名称的一部分:

    [Errno 13] Permission denied:
    /sites/site_name/media/images/image_name.original_RANDOM-STRING.jpg
    

    每个原始图像都在/media/original_images文件夹中,因此我实际上会认为它会从该文件夹中拉出OK,并在尝试编辑时在/media/images中创建xxxxx.original.xxx版本。但是,为什么不将xxxx.original.xxx版本放在/media/images文件夹中来修复这个错误,为什么它会查找带有随机生成字符串的版本,而不是简单地查找xxxx.original.xxx版本?

    1 回复  |  直到 7 年前
        1
  •  2
  •   gasman    7 年前

    每当请求特定大小的图像呈现时(通常通过 {% image %} 模板标签),wagtail检查 wagtailimages.Rendition 模型(或 custom Rendition model ,如果您的项目定义了一个)以查看是否存在该源图像和大小规格的现有格式副本记录。如果存在,则提供该现有图像文件的URL;如果不存在,则将在中生成新的图像文件和相应的数据库条目。 WagtailImages.rendition .

    将文件上载到 /media/images/ 不创建相应的 WagtailImages.rendition 条目将没有效果,因为wagtail将看到没有数据库条目,并得出必须创建新图像文件的结论。然后,在保存该文件时,Django分配唯一文件名的逻辑将生效,并为新文件提供一个随机文件名,以避免覆盖放置在其中的文件。

    那么,解决这个问题的直接方法是将数据库条目添加到 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/