Python Django二维码生成PIL图像使用S3保存不工作

Python Django二维码生成PIL图像使用S3保存不工作,python,django,amazon-s3,django-models,django-1.8,Python,Django,Amazon S3,Django Models,Django 1.8,我正在尝试根据模型生成二维码。我在Heroku托管该应用程序,并使用AWS S3作为sotrage。使用S3的存储与其他模型元素一起工作完全正常,只是用于生成QR码的模型出现了问题。我使用此链接作为参考: 我的模型是: class BusinessQRCode(models.Model): business = models.ForeignKey(Business, null=True) location_name = models.CharField(max_length=25

我正在尝试根据模型生成二维码。我在Heroku托管该应用程序,并使用AWS S3作为sotrage。使用S3的存储与其他模型元素一起工作完全正常,只是用于生成QR码的模型出现了问题。我使用此链接作为参考: 我的模型是:

class BusinessQRCode(models.Model):
    business = models.ForeignKey(Business, null=True)
    location_name = models.CharField(max_length=255)
    qrcode = models.ImageField(upload_to='documents/{}'.format(time.strftime("%Y/%m/%d")), blank=True, null=True)

    def save(self):
        super(BusinessQRCode, self).save()
        self.generate_qrcode()

    def generate_qrcode(self):
        from activation.models import RandomFileName

        qr = qrcode.QRCode(
            version=1,
            error_correction=qrcode.constants.ERROR_CORRECT_L,
            box_size=10,
            border=4,
        )
        qr.add_data('Some data')
        qr.make(fit=True)

        filename = 'qrcode-%s.png' % self.id

        img = qr.make_image()

        from django.conf import settings
        img.save(settings.MEDIA_ROOT + filename)

        # reopen = open(settings.MEDIA_ROOT + filename, "rb")
        # django_file = File(reopen)
        self.qrcode.save(filename,img, save=True)
上面的代码给了我这个错误:

TypeError

TypeError: seek() takes exactly 2 arguments (3 given)
我也尝试过使用注释代码,即打开文件,然后尝试保存它,但它不起作用,只是从未停止加载。我的意思是代码的这一部分最终:

reopen = open(settings.MEDIA_ROOT + filename, "rb")
django_file = File(reopen)
self.qrcode.save(filename,django_file, save=True)
我做错了什么

我也尝试过使用注释代码,即打开 文件,然后尝试保存它,但它不起作用,只是从来没有 停止加载

我认为最后一种方法应该有效,但由于在保存ImageField时使用了
save=True
,这也将触发父模型的
save()
方法。因此,您将在一个无限循环中结束

更改保存图像字段和模型的顺序

def save(self):
    # Generate qrcode before calling super.save
    self.generate_qrcode() 
    super(BusinessQRCode, self).save()

def generate_qrcode(self):

    ...

    with open(settings.MEDIA_ROOT + filename, "rb") as reopen:
        django_file = File(reopen)
        self.qrcode.save(filename,django_file, save=False)

添加错误的回溯。在将文件保存到S3后端时,应该使用django
file
对象,如上一个示例所示。什么类型的img是
img
?S3后端不直接从本地驱动器读取文件。@HåkenLid img是PIL Pillows图像类型。我将把stack trace.ImageField.save放在一个django文件对象中,所以我想这就是为什么传递一个PIL.Image时它会失败。在默认的本地存储中,我认为您可以将路径名作为字符串传递,但是S3后端更严格。谢谢,这是可行的:)我也会提出解决方案。在大多数情况下,这种无限递归会很快达到python的递归极限,您会看到
运行时错误:超过最大递归深度。
但是,由于每次保存时都通过internet将文件发送到S3,在达到递归限制之前,您必须等待相当长的时间。如果你在生产中遇到这样的错误,你至少会在收到亚马逊每月账单时注意到。