Загрузка изображения из 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)

Думаю, нам нужна другая конечная точка, с логикой для обработки загрузки, используя эту архитектуру:

  1. uploadImage (название для этой конечной точки другое) получает метаданные изображения от next js.
  2. uploadImage генерирует предварительно подписанный Url (поскольку вы используете S3), возвращает этот URL в nextjs, nextjs выполняет загрузку, используя этот предварительно подписанный url и вызывает конечную точку createProduct, передавая URL (uploadImage может фильтровать, чтобы вернуть точный URL объекта) и все данные о продукте для хранения в DB.
  3. .

Этот подход может быть лучше, если использовать паттерн 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

Думаю, нам нужна другая конечная точка, с логикой для обработки загрузки, используя эту архитектуру:

  1. uploadImage (название для этой конечной точки другое) получает метаданные изображения от next js.
  2. uploadImage генерирует предварительно подписанный Url (поскольку вы используете S3), возвращает этот URL в nextjs, nextjs выполняет загрузку, используя этот предварительно подписанный url и вызывает конечную точку createProduct, передавая URL (uploadImage может фильтровать, чтобы вернуть точный URL объекта) и все данные о продукте для хранения в DB.
  3. .

Этот подход может быть лучше, если использовать паттерн 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

Вернуться на верх