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

2024-07-03 08:06:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在根据模型生成二维码。我在Heroku托管这个应用程序,并使用aws3作为sotrage。S3的存储与其他模型元素一起工作得很好,只是QR代码生成的模型有问题。我用这个链接作为参考: https://gilang.chandrasa.com/blog/generate-qr-code-in-django-model/ 我的模型是:

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)

上面的代码给出了以下错误:

^{pr2}$

我也尝试过使用带注释的代码,这是打开文件,而不是试图保存它,但它不起作用,它只是从来没有停止加载。我的意思是这部分代码最后:

reopen = open(settings.MEDIA_ROOT + filename, "rb")
django_file = File(reopen)
self.qrcode.save(filename,django_file, save=True)

我做错什么了?在


Tags: django模型selftrueimgsettingsmodelssave
1条回答
网友
1楼 · 发布于 2024-07-03 08:06:32

I have tried using the commented code as well, that is opening the file and than trying to save it, but it doesnt work, it just never stops loading.

我认为最后一种方法应该行得通,但是由于您在保存ImageField时使用了save=True,这也将触发父模型的save()方法。所以你会在一个无限循环中结束。在

更改保存imagefield和模型的顺序。在

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)

相关问题 更多 >