Динамический просмотр изображений
В большинстве случаев разработчики, желающие генерировать изображения в 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/stable/advanced_topics/images/image_serve_view.html