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