Сохраните изображение, созданное с помощью Reportlab, в папке my MEDIA (в Amazon S3).

#python #django #heroku #amazon-s3 #reportlab

#питон #джанго #heroku #amazon-s3 #reportlab

Вопрос:

Я реализовал эту библиотеку для создания изображений штрих-кодов (http://kennethngedo.wordpress.com/2014/02/07/how-to-generate-barcode-in-django-using-reportlab /)

Все работает нормально, изображение сгенерировано правильно, НО … изображение создается в папке вне проекта, и поэтому я использую Heroku для производства, я не могу получить доступ к изображению.

Я использую эту структуру Django (http://django-skel.readthedocs.org/en/latest /) специально адаптирован для работы на Heroku с Amazon S3.

Ребята, вы знаете, как я могу загрузить сгенерированное изображение в свою медиа-папку на Amazon?

Это мой Views.py где создается и сохраняется изображение:

 from random import randint
from reportlab.lib.units import mm
from reportlab.graphics.barcode import *
from reportlab.graphics.shapes import Drawing, String
from django.shortcuts import render_to_response


class MyBarcodeDrawing(Drawing):
    def __init__(self, text_value, *args, **kw):
        barcode = createBarcodeDrawing('Code128', value=text_value, barHeight=10*mm, humanReadable=True)
        Drawing.__init__(self,barcode.width,barcode.height,*args,**kw)
        self.add(barcode, name='barcode')


def barcode_generator(barcode_value):
    text = barcode_value
    filename = "nightology_barcode_"   barcode_value
    path_to_save = "media/barcodes/"
    b = MyBarcodeDrawing(text)
    b.save(formats=['gif','pdf'],outDir=path_to_save,fnRoot=filename)
    barcodePicUrl = "barcode/"  filename   ".gif"
    return barcodePicUrl
 

Я надеюсь, что кто-нибудь сможет мне помочь в этом… Я буду очень признателен.

Спасибо!

Ответ №1:

У меня была аналогичная проблема, но без части Amazon S3. Для меня было очень легко создать новый файл в папке мультимедиа. Я мог бы просто использовать default_storage, чтобы получить путь к папке мультимедиа:

 from django.core.files.storage import default_storage
import os

# Get the path to the barcodes folder in the media folder
# check if the folder exists and create it if not

folderPath = default_storage.path('barcodes')
if not default_storage.exists('barcodes'):
    os.mkdir(folderPath)
 

Поскольку django-skel, похоже, использует серверную часть django-storage для Amazon S3, это также должно работать для вашей настройки. Если серверная часть хранилища Amazon S3 не является серверной частью хранилища по умолчанию, возможно, вам придется использовать S3Storage класс напрямую.

Комментарии:

1. Я заметил, что у меня было имя папки «отчеты» при проверке, существует ли путь. Исправлено, чтобы это были «штрих-коды», как в строке выше.