Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.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
Python Django将映像上载到AWS S3在升级到Django 1.10后不工作_Python_Django_Amazon Web Services_Amazon S3_Pillow - Fatal编程技术网

Python Django将映像上载到AWS S3在升级到Django 1.10后不工作

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):

我已经(最终)从Django 1.8升级到Django 1.10,虽然有一些明显的挑战,但唯一的困难是我的图像上传到S3。在升级Django的同时,我还被迫升级Boto&PIL

虽然原始图像仍将正确上载到请求的存储桶(原始),但是,创建拇指并将其保存到另一个存储桶的保存功能不再工作

以下是我的代码,它在Django/Boto/PIL升级之前一直正常工作:

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包中。