【问题标题】:Wagtail getting/generating image urls from JSON api or directlyWagtail 从 JSON api 或直接获取/生成图像 url
【发布时间】:2018-01-25 17:17:17
【问题描述】:

我一直使用 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')),
    ...
]

但这不适用于流场,因为它们只会返回图像 ID。所以我想我会使用 Wagtail 图像 API,但这也不允许我访问直接 URL。

我找到了一些参考此文档的 google 小组答案:http://docs.wagtail.io/en/v1.9/advanced_topics/images/image_serve_view.html

但是,该页面似乎不存在于最新版本的文档中,并且似乎不允许我从前端的 url 生成图像。

有没有办法创建一个允许我根据其 ID 获取图像的 url?

例如:somehost:8000/images/1?width=200&height=200

或者我可能忽略了其他一些解决方案。

我喜欢 wagtail,但无法轻松访问图片 url 确实限制了它的 API 使用,我希望有一个好的解决方案。

谢谢

编辑: 我设法在文档中找到了这个: http://docs.wagtail.io/en/v1.11.1/advanced_topics/images/image_serve_view.html

但是他们说:

视图在 URL 中获取图像 ID、过滤器规范和安全签名。如果这些参数有效,它会提供符合该条件的图像文件。

但他们没有给出一个清晰的例子来说明这样的请求是什么样的,或者我将如何生成该安全签名。

【问题讨论】:

  • 只是在 2018 年 4 月 v2.0.1 中提到,关于“动态图像服务视图”的文档仍然同样缺乏。 : (

标签: django wagtail wagtail-streamfield


【解决方案1】:

将图像再现作为 StreamField 数据结构的一部分的一种(有点笨拙)方法是覆盖 ImageChooserBlockget_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,
            }

在您的 StreamField 定义中使用此版本的 ImageChooserBlock 之后,您将在 API 响应中提供“大”和“缩略图”再现,而不仅仅是图像 ID。

【讨论】:

  • 这非常适合我的用例!谢谢 :) 我希望这是更多记录或更容易配置的东西,无法想象其他人在 API 上没有类似的问题
  • 为了与 v2 API 保持一致,我建议如下:ImageRenditionField('width-1000').to_representation(value) 这会生成一个带有键的字典:'url'、'width'、'height',而不是:'src'、'width '、'高度'、'alt'。 ImageRenditionField 可以这样导入:from wagtail.images.api.fields import ImageRenditionField
  • 完美!也适用于 StreamField 中的图像。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-15
  • 1970-01-01
  • 1970-01-01
  • 2011-09-18
  • 2018-10-21
相关资源
最近更新 更多