【问题标题】:Wagtail: Dynamic image generation and cachingWagtail:动态图像生成和缓存
【发布时间】:2017-01-13 19:17:39
【问题描述】:

我正在使用Generating dynamic image URLs in Python 中显示的技术通过 Wagtail 之外的 API 端点在页面上加载大量缩略图。起初这似乎可行,但在使用 Webkit Inspector 仔细检查后,似乎所有缩略图都是在每次页面加载时生成的,而不是从缓存中提供的。

文档说“再现是在第一次调用时生成的,随后的调用是从缓存中提供的。”

但在 Inspector 中,我看到每个缩略图都会生成 200,而不是 304,并且它们仅在我在“网络”选项卡中选择“全部”(而非图像)时才会显示。 Inspector 显示调用属于“文档”类型(不是图像)。

我正在使用的代码:

image = s.main_image()
filter_spec = 'fill-300x186|jpegquality-60'
signature = generate_signature(image.id, filter_spec)
url = reverse('wagtailimages_serve', args=(signature, image.id, filter_spec))
url += image.file.name[len('original_images/'):]
shop['img_url'] = url

一个示例图像 URL 是:

/images/OGJXq3f3oz0AAzD9vFo-HE24Sz8=/414/fill-300x186%7Cjpegquality-60/ceram_marhc_2920120329_0247_1_Sia8Kgl.jpg

想法?

更新:虽然接受的答案有效,但事实证明我们过于复杂了。更好的方法是不使用自定义签名和 url 生成例程。相反,只需使用 Wagtail 的 get_rendition() 方法:

image = s.main_image()
shop['img_url'] = image.get_rendition('fill-300x186|jpegquality-60').url

并且根本不使用 URL 装饰器。图像在第一次访问时生成并存储,并在后续访问时返回 304 就好了。

【问题讨论】:

    标签: python caching wagtail


    【解决方案1】:

    使用 Wagtail 的 generate_signature 函数生成的图像 URL 不会被浏览器自动缓存。这是因为默认情况下,针对这些 URL 的请求,请求标头中没有 cache-control 设置。

    但是,有一个解决方法(未记录,reference)。要在使用generate_signature 创建的图像 URL 的请求标头中实现缓存控制参数,您需要使用缓存控制 max-age 来装饰您的图像 URL,如下所示:

    from django.views.decorators.cache import cache_control
    ...
    from wagtail.wagtailimages import urls as wagtailimages_urls
    from wagtail.utils.urlpatterns import decorate_urlpatterns
    
    # attach cache-control parameter to your /images/* URL
    urlpatterns += decorate_urlpatterns(
        [url(r'^images/', include(wagtailimages_urls))],
        cache_control(max_age=1209600)
    )
    

    /images 的任何图像 URL 的所有请求现在都将在响应标头中包含 cache-control: max-age=120900 参数,并将被浏览器缓存。

    【讨论】:

    • 完美!谢谢@inostia。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 2011-03-31
    • 2023-03-28
    • 2017-07-08
    • 1970-01-01
    相关资源
    最近更新 更多