2017-02-04 18 views
1

モデルに基づいて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) 

私は間違っていますか?

+0

エラーのトレースバックを追加します。ファイルをS3バックエンドに保存するときは、最後の例のようにdjangoの 'File'オブジェクトを使用するべきです。 'img'はどんなタイプですか? S3バックエンドはローカルドライブから直接ファイルを読み込みません。 –

+0

@HåkenLidimgはPIL Pillowsの画像タイプです。私はスタックトレースを入れます。 – Maverick

+0

ImageField.saveはdjango Fileオブジェクトを想定していますので、PIL.Imageを渡すと失敗します。デフォルトのローカルストレージでは、文字列としてパス名を渡すことで逃げるかもしれないと思いますが、S3バックエンドはより厳密です。 –

答えて

1

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()メソッドをトリガーします。だからあなたは無限ループに終わるでしょう。

イメージフィールドとモデルを保存する順序を変更します。

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) 
+0

ありがとう、これは動作します:)私は解決策も入れます。 – Maverick

+0

ほとんどの場合、この種の無限再帰はすぐにPythonの再帰制限に遭遇し、 'RuntimeError:maximum recursion depth exceeded。 'が表示されます。ただし、保存するたびにインターネット経由でS3にファイルを送信するので、再帰制限を打つ前にかなり待ってください。プロダクションでこのようなバグがある場合は、Amazonから毎月の請求書を受け取ったときに少なくとも気づくでしょう。 –

関連する問題