モデルに基づいてQRコードを生成しようとしています。私はHerokuでアプリケーションをホストし、AWS S3をsotrageとして使用しています。 S3を使ったストレージは、他のモデル要素とまったく同じように動作します。QRコード生成のモデルだけで問題が生じています。私はリファレンスとして、このリンクを使用しています: https://gilang.chandrasa.com/blog/generate-qr-code-in-django-model/ 私のモデルは次のとおりです。Django QRコード生成S3を使用したPIL画像保存が動作しない
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)
私は間違っていますか?
エラーのトレースバックを追加します。ファイルをS3バックエンドに保存するときは、最後の例のようにdjangoの 'File'オブジェクトを使用するべきです。 'img'はどんなタイプですか? S3バックエンドはローカルドライブから直接ファイルを読み込みません。 –
@HåkenLidimgはPIL Pillowsの画像タイプです。私はスタックトレースを入れます。 – Maverick
ImageField.saveはdjango Fileオブジェクトを想定していますので、PIL.Imageを渡すと失敗します。デフォルトのローカルストレージでは、文字列としてパス名を渡すことで逃げるかもしれないと思いますが、S3バックエンドはより厳密です。 –