Python Django将映像上载到AWS S3在升级到Django 1.10后不工作
我已经(最终)从Django 1.8升级到Django 1.10,虽然有一些明显的挑战,但唯一的困难是我的图像上传到S3。在升级Django的同时,我还被迫升级Boto&PIL 虽然原始图像仍将正确上载到请求的存储桶(原始),但是,创建拇指并将其保存到另一个存储桶的保存功能不再工作 以下是我的代码,它在Django/Boto/PIL升级之前一直正常工作:Python Django将映像上载到AWS S3在升级到Django 1.10后不工作,python,django,amazon-web-services,amazon-s3,pillow,Python,Django,Amazon Web Services,Amazon S3,Pillow,我已经(最终)从Django 1.8升级到Django 1.10,虽然有一些明显的挑战,但唯一的困难是我的图像上传到S3。在升级Django的同时,我还被迫升级Boto&PIL 虽然原始图像仍将正确上载到请求的存储桶(原始),但是,创建拇指并将其保存到另一个存储桶的保存功能不再工作 以下是我的代码,它在Django/Boto/PIL升级之前一直正常工作: class Photo(models.Model): ... def save(self, *args, **kwargs):
class Photo(models.Model):
...
def save(self, *args, **kwargs):
super(Photo, self).save(*args, **kwargs)
self.create_avatar_thumb()
def create_avatar_thumb(self):
import os
from PIL import Image
from django.core.files.storage import default_storage as storage
if not self.filename:
return ""
file_path = self.filename.name
filename_base, filename_ext = os.path.splitext(file_path)
original_file_path = "%s%s" % (filename_base, filename_ext)
xm_file_path = original_file_path.replace('originals/', 'xm/')
if storage.exists(xm_file_path):
return "exists"
# resize the original image to xs
f = storage.open(file_path, 'r')
image = Image.open(f)
print image # example 1
xm_size = 40, 40
image.thumbnail(xm_size, Image.ANTIALIAS)
f_thumb = storage.open(xm_file_path, "w")
print f_thumb # example 2
image.save(f_thumb, quality=100)
f_thumb.close()
我的测试: 运行此脚本时没有错误
两个观察结果:当我运行
print
时,#示例1将打印两次,而#示例2上的print
是空的我在使用s3时遇到了枕头的.save()
方法的问题,因此我在保存之前先执行了一个StringIO
from django.core.files.storage import default_storage as storage
from cStringIO import StringIO #for python2, you'd use "from io..." in python3
# let's say we have a PIL image called 'Image'
sfile = StringIO()
Image.save(sfile, format="png") # save a png to the StringIO
with storage.open('somepath/somefile.png', 'w+') as f:
f.write(sfile.getvalue())
我在Django 1.9上。我不知道为什么升级时会出现这种情况,但这对我来说是有效的。我对Pillow使用s3的
.save()
方法有问题,所以我在保存之前先执行了StringIO
from django.core.files.storage import default_storage as storage
from cStringIO import StringIO #for python2, you'd use "from io..." in python3
# let's say we have a PIL image called 'Image'
sfile = StringIO()
Image.save(sfile, format="png") # save a png to the StringIO
with storage.open('somepath/somefile.png', 'w+') as f:
f.write(sfile.getvalue())
我在Django 1.9上。我不知道为什么升级时会出现这种情况,但这正是对我有效的方法。Jeremy S.answer对我有效,除了我需要使用BytesIO():
从io导入字节io。这是在AWS上将django 1.11与python3和s3Boto3存储一起使用。Jeremy S.答案对我很有用,只是我需要使用BytesIO()
从io导入字节io。这是在AWS上使用django 1.11和python3和s3Boto3存储。感谢您的回复。我一定会试试看。实际上,Pillow4.0与Django1.8配合使用还可以。django存储在1.1.8版和1.2.0版之间有一些变化。因为当我使用比Django storages 1.8更新的任何东西时,上传在Django 1.8中不再有效。。当我将django storages 1.8与django 1.10一起使用时,我得到了一个意外的关键字参数“max_length”错误,我无法覆盖它,因为它在django storages包中。感谢您的回复。我一定会试试看。实际上,Pillow4.0与Django1.8配合使用还可以。django存储在1.1.8版和1.2.0版之间有一些变化。因为当我使用比Django storages 1.8更新的任何东西时,上传在Django 1.8中不再有效。。当我将django storages 1.8与django 1.10一起使用时,我得到了一个意外的关键字参数“max_length”错误,我无法覆盖它,因为它在django storages包中。