Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
以编程方式将图像保存到Django ImageField,在生产中返回404_Django_Nginx_Django Models_Python Imaging Library_Django Media - Fatal编程技术网

以编程方式将图像保存到Django ImageField,在生产中返回404

以编程方式将图像保存到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

我有一个Django应用程序,用户可以上传图片,如果他们愿意的话,还可以拥有经过处理的图片版本。处理函数返回路径,所以我的方法是

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]

因此,显式地创建URL
media/path/to/image
,并删除所有不需要的部分,如
home/ubuntu
和其他内容

,Django会像正常上载一样直接处理文件属性,我不会有处理过的文件的副本吗?@Ammarrady是的,Django将处理该文件,就像正常上载一样。关于重复文件,不要自己将处理过的文件保存到磁盘上,让Django来处理。谢谢你的帮助,你的答案非常好,这种方法很好,我尝试了另一种方法,你可以检查它。是的,这似乎是一个更简单更好的解决方案。