123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- .. _using_images_outside_wagtail:
- ========================
- Dynamic image serve view
- ========================
- In most cases, developers wanting to generate image renditions in Python should use the ``get_rendition()``
- method. See :ref:`image_renditions`.
- If you need to be able to generate image versions for an *external* system such as a blog or mobile app,
- Wagtail provides a view for dynamically generating renditions of images by calling a unique URL.
- The view takes an image id, filter spec and security signature in the URL. If
- these parameters are valid, it serves an image file matching that criteria.
- Like the ``{% image %}`` tag, the rendition is generated on the first call and
- subsequent calls are served from a cache.
- Setup
- =====
- Add an entry for the view into your URLs configuration:
- .. code-block:: python
- 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)),
- ]
- Usage
- =====
- Image URL generator UI
- ----------------------
- When the dynamic serve view is enabled, an image URL generator in the admin
- interface becomes available automatically. This can be accessed through the edit
- page of any image by clicking the "URL generator" button on the right hand side.
- This interface allows editors to generate URLs to cropped versions of the image.
- Generating dynamic image URLs in Python
- ---------------------------------------
- Dynamic image URLs can also be generated using Python code and served to a
- client over an API or used directly in the template.
- One advantage of using dynamic image URLs in the template is that they do not
- block the initial response while rendering like the ``{% image %}`` tag does.
- The ``generate_image_url`` function in ``wagtail.images.views.serve`` is a convenience
- method to generate a dynamic image URL.
- Here's an example of this being used in a view:
- .. code-block:: python
- 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')
- })
- Image operations can be chained by joining them with a ``|`` character:
- .. code-block:: python
- return render(request, 'display_image.html', {
- 'image_url': generate_image_url(image, 'fill-100x100|jpegquality-40')
- })
- In your templates:
- .. code-block:: html+django
- {% 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" %}
- You can pass an optional view name that will be used to serve the image through. The default is ``wagtailimages_serve``
- Advanced configuration
- ======================
- .. _image_serve_view_redirect_action:
- Making the view redirect instead of serve
- -----------------------------------------
- By default, the view will serve the image file directly. This behaviour can be
- changed to a 301 redirect instead which may be useful if you host your images
- externally.
- To enable this, pass ``action='redirect'`` into the ``ServeView.as_view()``
- method in your urls configuration:
- .. code-block:: python
- from wagtail.images.views.serve import ServeView
- urlpatterns = [
- ...
- re_path(r'^images/([^/]*)/(\d*)/([^/]*)/[^/]*$', ServeView.as_view(action='redirect'), name='wagtailimages_serve'),
- ]
- .. _image_serve_view_sendfile:
- Integration with django-sendfile
- --------------------------------
- `django-sendfile`_ offloads the job of transferring the image data to the web
- server instead of serving it directly from the Django application. This could
- greatly reduce server load in situations where your site has many images being
- downloaded but you're unable to use a :ref:`caching_proxy` or a CDN.
- .. _django-sendfile: https://github.com/johnsensible/django-sendfile
- You firstly need to install and configure django-sendfile and configure your
- web server to use it. If you haven't done this already, please refer to the
- `installation docs <https://github.com/johnsensible/django-sendfile#django-sendfile>`_.
- To serve images with django-sendfile, you can use the ``SendFileView`` class.
- This view can be used out of the box:
- .. code-block:: python
- from wagtail.images.views.serve import SendFileView
- urlpatterns = [
- ...
- re_path(r'^images/([^/]*)/(\d*)/([^/]*)/[^/]*$', SendFileView.as_view(), name='wagtailimages_serve'),
- ]
- You can customise it to override the backend defined in the ``SENDFILE_BACKEND``
- setting:
- .. code-block:: python
- from wagtail.images.views.serve import SendFileView
- from project.sendfile_backends import MyCustomBackend
- class MySendFileView(SendFileView):
- backend = MyCustomBackend
- You can also customise it to serve private files. For example, if the only need
- is to be authenticated (e.g. for Django >= 1.9):
- .. code-block:: python
- from django.contrib.auth.mixins import LoginRequiredMixin
- from wagtail.images.views.serve import SendFileView
- class PrivateSendFileView(LoginRequiredMixin, SendFileView):
- raise_exception = True
|