Spec-Zone.ru › Wagtail 3

Динамический просмотр изображений

В большинстве случаев разработчикам, желающим генерировать изображения в Python, следует использовать метод get_rendition(). См. Генерация изображений в Python.

Если вам необходимо генерировать версии изображений для внешней системы, такой как блог или мобильное приложение, Wagtail предоставляет представление для динамической генерации изображений путем вызова уникального URL.

Представление принимает идентификатор изображения, спецификацию фильтра и подпись безопасности в URL. Если эти параметры валидны, оно предоставляет файл изображения, соответствующий этим критериям.

Как и тег {% image %}, изображение генерируется при первом вызове, а последующие вызовы обслуживаются из кэша.

Настройка

Добавьте запись для представления в вашу конфигурацию URL:

from wagtail.images.views.serve import ServeView

urlpatterns = [
    ...

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

    ...

    # Ensure that the wagtailimages_serve line appears above the default Wagtail page serving route
    re_path(r'', include(wagtail_urls)),
]

Использование

Интерфейс генератора URL изображений

Когда динамическое представление для обслуживания изображений включено, автоматически становится доступным генератор URL изображений в интерфейсе администрирования. К нему можно получить доступ на странице редактирования любого изображения, нажав кнопку «Генератор URL» справа.

Этот интерфейс позволяет редакторам генерировать URL-адреса обрезанных версий изображения.

Генерация динамических URL-адресов изображений в Python

Динамические URL-адреса изображений также можно генерировать с помощью кода Python и передавать клиенту через API или использовать непосредственно в шаблоне.

Одно из преимуществ использования динамических URL-адресов изображений в шаблоне заключается в том, что они не блокируют начальный ответ во время рендеринга, как это делает тег {% image %}.

Функция generate_image_url в wagtail.images.views.serve является удобным методом для генерации динамического 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 %}
...

<!-- Get the url for the image scaled to a width of 400 pixels: -->
{% image_url page.photo "width-400" %}

<!-- Again, but this time as a square thumbnail: -->
{% image_url page.photo "fill-100x100|jpegquality-40" %}

<!-- This time using our custom image serve view: -->
{% image_url page.photo "width-400" "mycustomview_serve" %}

Вы можете передать необязательное имя представления, которое будет использоваться для обслуживания изображения. По умолчанию это wagtailimages_serve

Дополнительная настройка

Настройка представления для перенаправления вместо обслуживания

По умолчанию представление будет непосредственно отображать файл изображения. Это поведение можно изменить на перенаправление 301, что может быть полезно, если вы размещаете свои изображения на внешнем сервере.

Для этого передайте action='redirect' в метод ServeView.as_view() в вашей конфигурации URL:

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 и настроить ваш веб-сервер для его использования. Если вы еще не сделали этого, обратитесь к документации по установке .

Для обслуживания изображений с django-sendfile можно использовать класс SendFileView. Это представление может быть использовано «из коробки»:

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

© 2014-present Torchbox Ltd and individual contributors.
All rights are reserved.
Licensed under the BSD License.
https://docs.wagtail.org/en/v3.0.3/advanced_topics/images/image_serve_view.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API