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