Как автоматически загрузить изображение из приложения django в aws s3

Когда пользователь создает или регистрирует новую учетную запись на моем веб-сайте, создается (генерируется) изображение, которое должно быть загружено в корзину s3. Образ успешно создан (проверено запуском команды ls на сервере в каталоге мультимедиа), но не загружается на s3. Однако, когда я пытаюсь загрузить изображение для учетной записи пользователя из панели администратора, изменения правильно отражаются в s3 (т. е. недавно загруженное изображение из панели администратора отображается в каталоге корзины s3, но это невозможно, поскольку доступ к панели). Я стремлюсь автоматически загружать сгенерированное изображение в корзину s3 при создании новой учетной записи.
Вот некоторый связанный код. просмотры.py

def signup(request):

    if request.method == "POST":
        base_form = UserForm(data=request.POST)
        addnl_form = AddnlForm(data=request.POST)

        if base_form.is_valid() and addnl_form.is_valid():

            usrnm = base_form.cleaned_data['username']
           
            if UserModel.objects.filter(user__username=usrnm).count()==0:
                user = base_form.save()
            user.set_password(user.password)
            user.save()

            #print(img)

            addnl = addnl_form.save(commit=False )
            addnl.user = user
            
            
            
            img = qr.make_image()  #create a qr code image, full code not included.
            img.save('media/qrcodes/%s.png'%usrnm)
           
                
            addnl.qr_gen = 'qrcodes/%s.png'%usrnm
            addnl.save()

        
        else:
            messages.error(request,base_form.errors,addnl_form.errors)
    else:
        base_form = UserForm()
        addnl_form = AddnlForm()
    
    return render(request,'app/signup.html',{'base_form':base_form,'addnl_form':addnl_form} )

модели.py

class UserModel(models.Model):
   .
   .
   .
   qr_gen = models.ImageField(upload_to='qrcodes',default=None,null=True,blank=True)

settings.py

DEFAULT_FILE_STORAGE = 'project.storage_backend.MediaStorage'

storage_backend.py

from storages.backends.s3boto3 import S3Boto3Storage


class MediaStorage(S3Boto3Storage):
    location = 'media'
    default_acl = 'public-read'
    file_overwrite = False

ОБНОВЛЕНИЕ
Вместо автоматического создания изображения и загрузки его на s3, если я загружаю любое изображение в регистрационную форму, даже в этом случае оно успешно загружается на s3, единственный случай, когда это не удается, - это когда мне нужно автоматически загружать без пользователя вмешательство.
Пожалуйста, помогите мне решить эту проблему. Спасибо.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
1 600
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вместо глобальной настройки параметра хранилища мультимедиа установите его в поле

class UserModel(models.Model):
    ...
    qr_gen = models.ImageField(upload_to='qrcodes',storage=MediaStorage())

Я пробовал это, но проблема все еще сохраняется.

Prajwal Kulkarni 25.12.2020 19:10

Я бы порекомендовал взглянуть на django-storages, который автоматизирует все это, поэтому вам следует беспокоиться только о форме и представлении, а не о чем-либо еще. Там вы найдете помощь в том, как легко работать с изображениями.

Ответ принят как подходящий

Автоматическая загрузка изображения непосредственно в s3 требует прямого взаимодействия с внутренним API S3. Простого использования django-storages или настройки пути DEFAULT_FILE_STORAGE недостаточно, поскольку это только помогает указать загруженным пользователем файлам указанное ведро/путь s3. Эту проблему можно решить с помощью метода boto3 библиотеки upload_file.
Пример использования:

import boto3
s3 = boto3.resource('s3')
s3.Bucket('mybucket').upload_file('/tmp/hello.txt', 'hello.txt')

Параметры:

Filename (str) -- The path to the file to upload.
Key (str) -- The name of the key to upload to.
ExtraArgs (dict) -- Extra arguments that may be passed to the client operation.
Callback (function) -- A method which takes a number of bytes transferred to be periodically called during the upload.

Другие вопросы по теме