Загрузка изображения из next.js в django для хранения в aws s3
Я настроил функциональность для s3, я могу легко загружать изображения из интерфейса администратора Django. У меня есть страница "createProduct", и я хочу создать продукт, отправив данные формы из next.js. Django хранит URL s3 bucket в DB и извлекает изображение из s3, когда это необходимо.
Я установил функциональность просмотра изображения и его обрезки, и она также работает. Для этого у меня есть отдельный компонент:
<div className="form-group">
<label htmlFor="image">Image</label>
<FileLoader
onFileUpload={image => setValue('image', image._id)}
/>
</div>
Мне нужно создать конечную точку. Admin, сначала загружает изображение, изображение сохраняется на s3, затем admin получает url изображения и передает его в данные формы, таким образом данные формы будут отправлены в конечную точку createProduct.
@api_view(['POST'])
@permission_classes([IsAdminUser])
def createProduct(request):
user=request.user
print("user in post",user)
print("request.data",request.data)
name=request.data['name']
price=request.data['price']
brand=request.data['brand']
countInStock=request.data['countInStock']
category=request.data['category']
description=request.data['description']
// Here i need to send the imag url I guess
image=request.FILES.get('image')
print("image",image)
product=Product.objects.create(user=user, name=name,
price=price,brand=brand,
countInStock=countInStock,category=category,description=description, image=image)
product.save()
serializer=ProductSerializer(product, many=False)
return Response(serializer.data)
Думаю, нам нужна другая конечная точка, с логикой для обработки загрузки, используя эту архитектуру:
- uploadImage (название для этой конечной точки другое) получает метаданные изображения от next js.
- uploadImage генерирует предварительно подписанный Url (поскольку вы используете S3), возвращает этот URL в nextjs, nextjs выполняет загрузку, используя этот предварительно подписанный url и вызывает конечную точку createProduct, передавая URL (uploadImage может фильтровать, чтобы вернуть точный URL объекта) и все данные о продукте для хранения в DB. .
Этот подход может быть лучше, если использовать паттерн SAGA для оркестровки вещей, потому что, поскольку вам нужно работать с двумя различными процессами (s3 upload и db transaction), вы можете оркестровать эти вещи, или использовать транзакции в монолитной архитектуре (вся бизнес-логика в одном развертывании).
Несколько советов:
Используя паттерн SAGA в этом случае, вам просто нужно создать задание на удаление изображения, если в createProduct произошла ошибка. Вы можете реализовать это с помощью логики во фронт-энде, чтобы поместить сообщение на SNS с лямбда-выражением для чтения из него и удаления изображения в S3, так как продукт не сохраняется правильно.
Документация:
https://microservices.io/patterns/data/saga.html https://docs.aws.amazon.com/AmazonS3/latest/userguide/PresignedUrlUploadObject.html
Думаю, нам нужна другая конечная точка, с логикой для обработки загрузки, используя эту архитектуру:
- uploadImage (название для этой конечной точки другое) получает метаданные изображения от next js.
- uploadImage генерирует предварительно подписанный Url (поскольку вы используете S3), возвращает этот URL в nextjs, nextjs выполняет загрузку, используя этот предварительно подписанный url и вызывает конечную точку createProduct, передавая URL (uploadImage может фильтровать, чтобы вернуть точный URL объекта) и все данные о продукте для хранения в DB. .
Этот подход может быть лучше, если использовать паттерн SAGA для оркестровки вещей, потому что, поскольку вам нужно работать с двумя различными процессами (s3 upload и db transaction), вы можете оркестровать эти вещи, или использовать транзакции в монолитной архитектуре (вся бизнес-логика в одном развертывании).
Несколько советов:
Используя паттерн SAGA в этом случае, вам просто нужно создать задание на удаление изображения, если в createProduct произошла ошибка. Вы можете реализовать это с помощью логики во фронт-энде, чтобы поместить сообщение на SNS с лямбда-выражением для чтения из него и удаления изображения в S3, так как продукт не сохраняется правильно.
Документация:
https://microservices.io/patterns/data/saga.html https://docs.aws.amazon.com/AmazonS3/latest/userguide/PresignedUrlUploadObject.html