【发布时间】:2016-09-24 22:42:36
【问题描述】:
尝试使用 Python3.4 使用 QR-code 5.3 生成 QR 码时。我遇到了几个问题:
起初我使用了 io.StringIO,我得到了一个 字符串参数,得到了 'bytes' 错误消息。所以我随后将 io.StringIO 更改为 io.BytesIO。然后我得到另一个错误是 '_io.BytesIO' object has no attribute 'len' 所以为了得到我使用的对象的长度 buffer.getbuffer().nbytes em> 但现在我得到了最大递归深度超出,它生成了 298 个二维码图像,而不仅仅是一个。任何想法我做错了什么?
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 的保存方法提供额外的第三个参数来绕过它。
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()后会发生什么变化? -
@AlexHall,是的,当我删除 self.qrcode.save 时,递归确实消失了,但是它不会保存生成的图像。
-
@Keiwan,没什么变化,结果还是一样