【问题标题】:Programmatically saving image to Django ImageField returning 404 in production以编程方式将图像保存到 Django ImageField 在生产中返回 404
【发布时间】:2019-08-09 17:01:20
【问题描述】:

我有一个 Django 应用程序,用户可以在其中上传图像,并且可以根据需要获得图像的处理版本。并且处理函数返回路径,所以我的方法是

model2.processed_image = processingfunction( model1.uploaded_image.path)

当处理函数返回路径时,这就是它在我的管理视图中的样子

不像正常上传的图片

在我的机器上它工作正常,我总是得到处理的 404 错误,而当我尝试更改处理的 url 时,正常上传的显示正确

myurl.com/media/home/ubuntu/Eyelizer/media/path/to/the/image 
 to 
myurl.com/media/path/to/the/image

那么我该如何解决这个问题?有没有更好的方法将图像手动保存到数据库?

我有相同的函数,但返回一个 Pil.image.image 对象,我尝试了很多方法将它保存在模型中,但我不知道如何让函数返回文件路径。

我认为问题出在我定义媒体路径的 nginx 上。

应该/我可以覆盖已处理图像的 url 属性吗? 制作类似的东西

model.processed_image.url = media/somefolder/filename

【问题讨论】:

    标签: django nginx django-models python-imaging-library django-media


    【解决方案1】:

    不要直接使用 PIL 映像,而是创建一个 django.core.files.File

    例子:

    from io import BytesIO
    from django.core.files import File
    
    img_io = BytesIO() # create a BytesIO object to temporarily save the file in memory
    img = processingfunction( model1.uploaded_image.path)
    img.save(img_io, 'PNG') # save the PIL image to the BytesIO object
    
    img_file = File(thumb_io, name='some-name.png') # create the File object
    # you can use the `name` from `model1.uploaded_image` and use 
    # that above
    
    # finally, pass the image file to your model field
    model2.processed_image = img_file
    

    为避免重复此代码,最好将此代码保留在 processingfunction 中并直接从那里返回 File 对象。

    【讨论】:

    • 并且 Django 会像正常上传一样直接处理文件属性
    • 我不会有已处理文件的副本吗?
    • @Ammarrady 是的,Django 会像正常上传文件一样处理文件。关于重复文件,不要自己将处理后的文件保存到磁盘,让Django处理。
    • 感谢您的帮助,您的回答真的很棒而且这种方法很好,我尝试了其他方法,您可以检查一下。
    【解决方案2】:

    我的方法与@Xyres 的有点不同,我认为 xyres 会复制现有图像并创建一个新图像,当我尝试覆盖 URL 属性时它返回错误

    无法设置属性

    但是当我看到this 问题和this 票时,我尝试制作这个并且它成功了

    model2.processed_image = processingfunction(model1.uploaded_image.path)
    full_path = model2.processed_image.path
    model2.processed_image.name = full_path.split('media')[1]
    

    以便明确地创建 URL media/path/to/image 并删除所有不需要的部分,例如 home/ubuntu 和其他东西

    【讨论】:

    • 是的,这似乎是一个更简单更好的解决方案。
    猜你喜欢
    • 2010-11-21
    • 1970-01-01
    • 2018-08-10
    • 2015-03-30
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    • 2013-02-13
    • 2015-05-24
    相关资源
    最近更新 更多