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, а не просто идентификатор изображения.