동적 이미지 제공 뷰

대부분의 경우, 파이썬에서 이미지 렌디션을 생성하려는 개발자는 get_rendition() 메서드를 사용해야 합니다. 파이썬에서 렌디션 생성하기를 참조하십시오.

블로그나 모바일 앱과 같은 외부 시스템용 이미지 버전을 생성해야 하는 경우, Wagtail은 고유한 URL을 호출하여 동적으로 이미지 렌디션을 생성하는 뷰를 제공합니다.

뷰는 URL에 이미지 ID, 필터 사양 및 보안 서명을 사용합니다. 만약 이러한 매개변수가 유효하면 해당 기준과 일치하는 이미지 파일을 제공합니다.

{% image %} 태그와 마찬가지로 렌디션은 첫 번째 호출 시 생성되고 후속 호출은 캐시에서 제공됩니다.

설정

URL 구성에 뷰에 대한 항목을 추가하십시오.

from wagtail.images.views.serve import ServeView

urlpatterns = [
    ...

    re_path(r'^images/([^/]*)/(\d*)/([^/]*)/[^/]*$', ServeView.as_view(), name='wagtailimages_serve'),

    ...

    # wagtailimages_serve 라인이 기본 Wagtail 페이지 제공 경로 위에 오도록 합니다.
    re_path(r'', include(wagtail_urls)),
]

사용법

이미지 URL 생성기 UI

동적 제공 뷰가 활성화되면 관리자 인터페이스의 이미지 URL 생성기가 자동으로 사용 가능하게 됩니다. 이것은 편집 페이지에서 오른쪽의 “URL 생성기” 버튼을 클릭하여 액세스할 수 있습니다.

이 인터페이스를 통해 편집자는 이미지의 잘린 버전에 대한 URL을 생성할 수 있습니다.

파이썬에서 동적 이미지 URL 생성

동적 이미지 URL은 파이썬 코드를 사용하여 생성하고 API를 통해 클라이언트에 제공하거나 템플릿에서 직접 사용할 수도 있습니다.

템플릿에서 동적 이미지 URL을 사용하는 한 가지 장점은 {% image %} 태그처럼 렌더링하는 동안 초기 응답을 차단하지 않는다는 것입니다.

wagtail.images.views.servegenerate_image_url 함수는 동적 이미지 URL을 생성하는 편리한 메서드입니다.

다음은 뷰에서 사용되는 예입니다.

def display_image(request, image_id):
    image = get_object_or_404(Image, id=image_id)

    return render(request, 'display_image.html', {
        'image_url': generate_image_url(image, 'fill-100x100')
    })

이미지 작업은 | 문자로 연결하여 연결할 수 있습니다.

return render(request, 'display_image.html', {
    'image_url': generate_image_url(image, 'fill-100x100|jpegquality-40')
})

템플릿에서:

{% load wagtailimages_tags %}
...

<!-- 너비가 400픽셀로 조정된 이미지의 URL 가져오기: -->
{% image_url page.photo "width-400" %}

<!-- 다시, 이번에는 정사각형 썸네일로: -->
{% image_url page.photo "fill-100x100|jpegquality-40" %}

<!-- 이번에는 사용자 정의 이미지 제공 뷰 사용: -->
{% image_url page.photo "width-400" "mycustomview_serve" %}

이미지를 제공하는 데 사용할 선택적 뷰 이름을 전달할 수 있습니다. 기본값은 wagtailimages_serve 입니다.

고급 구성

뷰가 제공하는 대신 리디렉션하도록 만들기

기본적으로 뷰는 이미지 파일을 직접 제공합니다. 이 동작은 대신 301 리디렉션으로 변경할 수 있으며, 이는 이미지를 외부에 호스팅하는 경우 유용할 수 있습니다.

이를 활성화하려면 URL 구성에서 ServeView.as_view() 메서드에 action='redirect' 를 전달하십시오.

from wagtail.images.views.serve import ServeView

urlpatterns = [
    ...

    re_path(r'^images/([^/]*)/(\d*)/([^/]*)/[^/]*$', ServeView.as_view(action='redirect'), name='wagtailimages_serve'),
]

django-sendfile과의 통합

django-sendfile은 이미지 데이터 전송 작업을 Django 애플리케이션에서 직접 제공하는 대신 웹 서버에 오프로드합니다. 이는 사이트에서 많은 이미지를 다운로드하지만 캐싱 프록시 또는 CDN을 사용할 수 없는 상황에서 서버 부하를 크게 줄일 수 있습니다.

먼저 django-sendfile을 설치 및 구성하고 웹 서버를 사용하도록 구성해야 합니다. 아직 수행하지 않은 경우 설치 문서를 참조하십시오.

SendFileView 클래스를 사용하여 django-sendfile로 이미지를 제공할 수 있습니다. 이 뷰는 즉시 사용할 수 있습니다.

from wagtail.images.views.serve import SendFileView

urlpatterns = [
    ...

    re_path(r'^images/([^/]*)/(\d*)/([^/]*)/[^/]*$', SendFileView.as_view(), name='wagtailimages_serve'),
]

SENDFILE_BACKEND 설정에 정의된 백엔드를 재정의하도록 사용자 정의할 수 있습니다.

from wagtail.images.views.serve import SendFileView
from project.sendfile_backends import MyCustomBackend

class MySendFileView(SendFileView):
    backend = MyCustomBackend

비공개 파일을 제공하도록 사용자 정의할 수도 있습니다. 예를 들어, 유일한 요구 사항이 인증되는 경우(Django >= 1.9):

from django.contrib.auth.mixins import LoginRequiredMixin
from wagtail.images.views.serve import SendFileView

class PrivateSendFileView(LoginRequiredMixin, SendFileView):
    raise_exception = True