Как получить изображение с сервера с помощью django и graphql?

#django #image #file #get #graphql

#django #изображение #файл #получить #graphql ( графический sql ) #graphql

Вопрос:

Мне уже удалось внести изменения для загрузки, обновления и печати изображений. Но как я могу получить файлы изображений в base64 в запросе?

 class Image(models.Model):
    image = models.ImageField(blank=True, null=True, upload_to="uploads/images")
    product = models.ForeignKey(Product, on_delete=models.CASCADE, blank=True, null=True)
  

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

1. Рассматривали ли вы возможность возврата пути к изображению в graphql? Я спрашиваю, потому что ImageField хранит строковый путь к файлу изображения в каталоге мультимедиа в соответствии с вашими настройками.

2. Привет. Спасибо за комментарий. Я хотел вернуть файл с изображением в запросе. Я отправлю свой запрос прямо сейчас.

Ответ №1:

Я пишу свое собственное решение. Сначала я создал новое поле в объекте ImageType для хранения файла изображения в базе 64. Кроме того, я проверил, что значение поля изображения существует, а записанный адрес связан с существующим файлом на жестком диске. Затем, когда изображение запрашивается, появляется новое поле с именем base64file с сохраненным изображением, которое затем может быть декодировано во внешнем интерфейсе. Надеюсь, это кому-то поможет. Вот мой код:

 class ImageType(DjangoObjectType):
    class Meta:
        model = Image
        filter_fields = {'product_id': ['exact'],
        interfaces = (relay.Node,)

    base64file = graphene.String()

    def resolve_base64file(self, info):
        if self is not None and self.image and hasattr(self.image, 'url'):
            if os.path.isfile(self.image.url):
                return base64.b64encode(self.image.read())
            else:
                return 'File not found'
        return ''
  

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

1. Это вызовет проблемы, если / когда вы начнете хранить свои изображения на сервере, который отличается от вашего реального веб-сервера.

2. Кроме того, передавая URL-адреса в браузер, вы можете разрешить браузеру использовать собственный кэш для более быстрой загрузки изображений. Загружая их в веб-приложение, вы заставляете браузер повторно использовать ресурсы снова и снова.

3. Я понимаю, спасибо. Итак, как я могу создать конечный пункт, где можно получить изображение из серверной части, если я использую graphql?

4. Как клиент отображает изображения? Вот что пришлось бы изменить.

5. Он будет использовать React amp; Apollo. В зависимости от того, как я его отправлю.