Wagtail получение / генерация URL-адресов изображений из JSON API или напрямую

Я использовал Wagtail в качестве безголовой CMS для использования с внешним интерфейсом, однако я заметил некоторые ограничения в отношении изображений. Обычно в вашем шаблоне jinja вы генерируете нужный размер изображения, и все в порядке, однако у меня нет доступа к этим помощникам в моем коде внешнего интерфейса. Я пробовал несколько вещей. например, чтобы решить эту проблему для простых моделей страниц и их полей, я мог бы отобразить настраиваемое поле API следующим образом:

api_fields = [
    # Adds information about the source image (eg, title) into the API
    APIField('feed_image'),

    # Adds a URL to a rendered thumbnail of the image to the API
    APIField('feed_image_thumbnail', serializer=ImageRenditionField('fill-100x100', source='feed_image')),
    ...
]

Однако это не будет работать для streamfield, так как они будут возвращать только идентификатор изображения. Так что я решил использовать API изображений Wagtail, однако это также не позволяет мне получить доступ к прямому URL.

Я нашел некоторые ответы группы Google, ссылающиеся на эту документацию: http://docs.wagtail.io/en/v1.9/advanced_topics/images/image_serve_view.html

Однако эта страница, по-видимому, не существует в последней версии документации и, по-видимому, не позволяет мне генерировать изображения из URL-адреса внешнего интерфейса.

Есть ли способ создать URL, который позволит мне получить изображение на основе его идентификатора?

например: somehost:8000/images/1?width=200&height=200

Или, возможно, есть другое решение, которое я пропускаю.

Я люблю трясогузку, но отсутствие легкого доступа к URL-адресам изображений действительно ограничивает использование API, надеюсь, есть хорошее решение для этого.

Спасибо

РЕДАКТИРОВАТЬ: мне удалось найти это в документах: http://docs.wagtail.io/en/v1.11.1/advanced_topics/images/image_serve_view.html

Однако они заявляют:

Представление принимает идентификатор изображения, спецификацию фильтра и подпись безопасности в URL. Если эти параметры действительны, он передает файл изображения, соответствующий этим критериям.

Но они не дают четкого примера того, как будет выглядеть такой запрос или как я сгенерирую эту подпись безопасности.

1 ответ

Решение

Один (немного хакерский) способ получить изображение как часть структуры данных StreamField - переопределить ImageChooserBlock"s get_api_representation метод:

from wagtail.wagtailimages.blocks import ImageChooserBlock as DefaultImageChooserBlock

class ImageChooserBlock(DefaultImageChooserBlock):
    def get_api_representation(self, value, context=None):
        if value:
            return {
                'id': value.id,
                'title': value.title,
                'large': value.get_rendition('width-1000').attrs_dict,
                'thumbnail': value.get_rendition('fill-120x120').attrs_dict,
            }

Используя эту версию ImageChooserBlock в вашем определении StreamField вы получите "большие" и "миниатюрные" представления как часть ответа API, а не просто идентификатор изображения.

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