以编程方式将图像保存到Django ImageField,在生产中返回404
我有一个Django应用程序,用户可以上传图片,如果他们愿意的话,还可以拥有经过处理的图片版本。处理函数返回路径,所以我的方法是以编程方式将图像保存到Django ImageField,在生产中返回404,django,nginx,django-models,python-imaging-library,django-media,Django,Nginx,Django Models,Python Imaging Library,Django Media,我有一个Django应用程序,用户可以上传图片,如果他们愿意的话,还可以拥有经过处理的图片版本。处理函数返回路径,所以我的方法是 model2.processed_image = processingfunction( model1.uploaded_image.path) 当processing函数返回path时,下面是它在我的admin视图中的外观 不像通常上传的图像 在我的机器中,它工作正常,当我试图更改已处理文件的url时,我总是收到一个404错误,而正常上传的文件显示正确 myu
model2.processed_image = processingfunction( model1.uploaded_image.path)
当processing函数返回path时,下面是它在我的admin视图中的外观
不像通常上传的图像
在我的机器中,它工作正常,当我试图更改已处理文件的url时,我总是收到一个404错误,而正常上传的文件显示正确
myurl.com/media/home/ubuntu/Eyelizer/media/path/to/the/image
to
myurl.com/media/path/to/the/image
那么我该如何解决这个问题呢?是否有更好的方法将图像手动保存到数据库
我有相同的函数,但返回一个Pil.image.image对象,我尝试了许多方法将其保存在模型中,但我不知道如何使函数返回一个文件路径
我认为问题出在nginx中,我定义了媒体路径
我是否应该/是否可以覆盖ProcesseImage的url属性?
做一些像
model.processed_image.url = media/somefolder/filename
不要直接使用PIL图像,而是创建一个 例如:
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
为了避免重复此代码,最好将此代码保存在
处理函数中,并直接从那里返回文件对象。我的方法与@Xyres的方法有点不同,我认为xyres将复制现有图像并创建一个新图像,当我尝试覆盖URL属性时,它返回了一个错误
无法设置属性
但当我看到问题和罚单时,我试着做了这个,结果成功了
model2.processed_image = processingfunction(model1.uploaded_image.path)
full_path = model2.processed_image.path
model2.processed_image.name = full_path.split('media')[1]
因此,显式地创建URLmedia/path/to/image
,并删除所有不需要的部分,如home/ubuntu
和其他内容,Django会像正常上载一样直接处理文件属性,我不会有处理过的文件的副本吗?@Ammarrady是的,Django将处理该文件,就像正常上载一样。关于重复文件,不要自己将处理过的文件保存到磁盘上,让Django来处理。谢谢你的帮助,你的答案非常好,这种方法很好,我尝试了另一种方法,你可以检查它。是的,这似乎是一个更简单更好的解决方案。