QRコード5.3をPython3.4を使用して生成しようとすると、私はいくつかの問題に直面しています:最大再帰深度を超過し、メソッドを保存する、Django
最初はio.StringIOを使用しましたが、文字列引数が必要ですが、 'bytes'がありますエラーメッセージ。そこで、io.StringIOをio.BytesIOに変更しました。次に、私は'_io.BytesIO'オブジェクトの属性が 'len'でない別のエラーが発生しましたbuffer.getbuffer()。nbytesしかし、今私はを取得していますオブジェクトの長さを取得するために最大再帰深度はを超え、1つではなく298のQRコードイメージを生成しています。私が間違っていることは何ですか?
from django.db import models
from django.conf import settings
from django.core.urlresolvers import reverse
from django.core.files.uploadedfile import InMemoryUploadedFile
import random
import qrcode
import io
import sys
from PIL import Image
import pdb;
def qrcode_location(instance, filename):
return '%s/qr_codes/%s' % (instance.user.username, filename)
# Create your models here.
class EmployeeProfile(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
qrcode = models.ImageField(upload_to=qrcode_location, null=True, blank=True)
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
def __str__(self):
return self.first_name + ' ' + self.lastname
def save(self):
first_initial = self.first_name[0].upper()
second_initial = self.last_name[0].upper()
id_number = first_initial + second_initial + str(random.randint(1000000, 9999999))
self.generate_qrcode()
if not EmployeeProfile.objects.filter(employee_id=id_number).exists():
self.employee_id = id_number
super(EmployeeProfile, self).save()
def generate_qrcode(self):
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)
img = qr.make_image()
buffer = io.BytesIO()
img.save(buffer)
filename = 'qrcode.png'
filebuffer = InMemoryUploadedFile(buffer, None, filename, 'image/png', buffer.getbuffer().nbytes, None)
self.qrcode.save(filename, filebuffer)
--------------------解決方法--------------------- ----------
saveはgenerate_qrcodeを呼び出していたので、self.qrcode.saveを呼び出していました。このモデルは無限再帰を引き起こすsaveを呼び出していました。したがって、FileFieldのsaveメソッドに第3の引数を追加するだけで、バイパスする必要がなくなります。
Django FileField in model maximum recursion depth exceeded while calling a Python object
# set 3 argument to false(save=False) otherwise infinite recursion will happen
self.qrcode.save(filename, filebuffer, False)
'pdb'を実行するとどうなりますか?また、暗闇の中で刺すこともありますが、 'self.qrcode.save'を削除すると、再帰はなくなりますか? –
'super(EmployeeProfile、self).save()を削除すると、何が変わるのですか? – Keiwan
@AlexHall、はい、self.qrcode.saveを削除すると再帰がなくなりますが、生成されたイメージは保存されません。 – nastyn8