Когда пользователь создает или регистрирует новую учетную запись на моем веб-сайте, создается (генерируется) изображение, которое должно быть загружено в корзину 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, единственный случай, когда это не удается, - это когда мне нужно автоматически загружать без пользователя вмешательство.
Пожалуйста, помогите мне решить эту проблему. Спасибо.






Вместо глобальной настройки параметра хранилища мультимедиа установите его в поле
class UserModel(models.Model):
...
qr_gen = models.ImageField(upload_to='qrcodes',storage=MediaStorage())
Я бы порекомендовал взглянуть на 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')
Я пробовал это, но проблема все еще сохраняется.