Создание QR-кода и сохранение изображения QR-кода в AWS S3 в Django Rest Framework - PullRequest
0 голосов
/ 12 июля 2020

Привет, я генерирую QR-код, используя библиотеку qrcode в Python. Я установил место хранения по умолчанию для изображений / файлов, которые должны быть загружены в S3, и он работает нормально, если я ввожу данные через API. Но в случае генерации QR-кода новое изображение не сохраняется в корзине в S3.

Models.py

class Item(models.Model):
    name = models.CharField(max_length=30)
    qr = models.ImageField(upload_to="asset_tags", null=True, blank=True)
    image = models.ImageField(upload_to="asset_tags", null=True, blank=True)

Генерировать QR код:

def generate_qr(self, qr):
    qr = qrcode.QRCode(
        version=1,
        error_correction=qrcode.constants.ERROR_CORRECT_M,
        box_size=15,
        border=5
    )
    qr.add_data(qr)
    qr.make(fit=True)
    img = qr.make_image(fill='black', back_color='white')
    img.save(qr+".png")

settings.py

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

Здесь поле Image в models.py - это изображение, загруженное пользователем, которое получает сохранено в ведре. Но изображение qrcode сохраняется в root проекта. Я запутался, если мне нужно преобразовать этот объект изображения подушки в поле изображения django, и оно будет автоматически сохранено в ведре.

Спасибо, любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 13 июля 2020

Я нашел решение. Мне нужно было вызвать API put_object с учетными данными aws. Эти учетные данные должны быть переданы в файле переменных среды. Это сохраняет ваш файл или изображение в корзину в root, если имя папки не указано в ключе.

def generate_qr(self, qr):
    qr = qrcode.QRCode(
        version=1,
        error_correction=qrcode.constants.ERROR_CORRECT_M,
        box_size=15,
        border=5
    )
    qr.add_data(tag)
    qr.make(fit=True)
    img = qr.make_image(fill='black', back_color='white')

    buffer = BytesIO()
    img.save(buffer, "PNG")
    buffer.seek(0) # rewind pointer back to start
    s3 = boto3.client('s3')
    s3 = boto3.client('s3', aws_access_key_id='ACCESS KEY HERE', aws_secret_access_key='SECRET ACCESS KEY', region_name='REGION NAME')
    s3.put_object(
        Bucket='BUCKET NAME',
        Key='media/'+qr+'.png',
        Body=buffer,
        ContentType='image/png',
    )

Спасибо за вашу помощь, ребята.

...