我一直在使用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,因为这些只会返回图片ID。所以我想我会使用Wagtail图像API,但这不允许我访问直接URL。
我发现一些google小组的答案参考了这个文档:http://docs.wagtail.io/en/v1.9/advanced_topics/images/image_serve_view.html
然而,这个页面似乎不存在于最新版本的文档中,并且似乎不允许我从前端的URL生成图像。
有没有办法可以创建一个允许我根据其ID获取图像的网址?
例如:somehost:8000/images/1?width=200&height=200
或者我可能会忽略其他一些解决方案。
我喜欢w ,,但没有轻易访问图片网址确实限制了它的API使用,我希望有一个很好的解决方案。
由于
编辑: 我设法在文档中找到了这个: http://docs.wagtail.io/en/v1.11.1/advanced_topics/images/image_serve_view.html
然而他们说:
视图在URL中采用图像ID,过滤规范和安全签名。如果这些参数有效,则会提供与该条件匹配的图像文件。
但他们没有明确说明这样的请求是什么样的,或者我将如何生成该安全签名。
答案 0 :(得分:5)
将图像呈现作为StreamField数据结构的一部分的一种(略微hacky)方法是覆盖ImageChooserBlock
的{{1}}方法:
get_api_representation
在您的StreamField定义中使用此版本的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,
}
,您将获得“' large'和' thumbnail'将再现作为API响应的一部分,而不仅仅是图像ID。