Wagtail:动态图像生成和缓存
Wagtail: Dynamic image generation and caching
我正在使用 Generating dynamic image URLs in Python 中所示的技术,通过 Wagtail 外部的 API 端点在页面上加载大量缩略图。起初这似乎可行,但在使用 Webkit Inspector 仔细检查后,似乎所有缩略图都是在每次页面加载时生成的,而不是从缓存中提供的。
文档说 "the rendition is generated on the first call and subsequent calls are served from a cache."
但是在 Inspector 中,我看到每个缩略图都生成一个 200,而不是 304,并且只有当我在“网络”选项卡中 select "All"(不是图像)时它们才会出现。 Inspector 显示调用的类型为 "document"(不是图像)。
我使用的代码:
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 装饰器。图像在第一次访问时生成并存储,return 304 在后续访问时就好了。
使用 Wagtail 的 generate_signature
函数 生成的图像 URL 不会被浏览器自动缓存 。这是因为默认情况下,对于这些 URL 的请求 header 中没有 cache-control
设置。
有一个 work-around,但是(未记录,reference)。要在使用 generate_signature
创建的图像 URL 的请求 header 中实现 cache-control 参数,您需要使用 [=26= 修饰图像 URL ] max-age,如下:
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 的所有请求现在将在响应 header 中包含 cache-control: max-age=120900
参数,并将由浏览器缓存。
我正在使用 Generating dynamic image URLs in Python 中所示的技术,通过 Wagtail 外部的 API 端点在页面上加载大量缩略图。起初这似乎可行,但在使用 Webkit Inspector 仔细检查后,似乎所有缩略图都是在每次页面加载时生成的,而不是从缓存中提供的。
文档说 "the rendition is generated on the first call and subsequent calls are served from a cache."
但是在 Inspector 中,我看到每个缩略图都生成一个 200,而不是 304,并且只有当我在“网络”选项卡中 select "All"(不是图像)时它们才会出现。 Inspector 显示调用的类型为 "document"(不是图像)。
我使用的代码:
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 装饰器。图像在第一次访问时生成并存储,return 304 在后续访问时就好了。
使用 Wagtail 的 generate_signature
函数 生成的图像 URL 不会被浏览器自动缓存 。这是因为默认情况下,对于这些 URL 的请求 header 中没有 cache-control
设置。
有一个 work-around,但是(未记录,reference)。要在使用 generate_signature
创建的图像 URL 的请求 header 中实现 cache-control 参数,您需要使用 [=26= 修饰图像 URL ] max-age,如下:
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 的所有请求现在将在响应 header 中包含 cache-control: max-age=120900
参数,并将由浏览器缓存。