0
0
mirror of https://github.com/wagtail/wagtail.git synced 2024-11-29 17:36:49 +01:00
wagtail/docs/advanced_topics/api/v2/usage.rst

649 lines
18 KiB
ReStructuredText
Raw Normal View History

2016-09-22 12:15:18 +02:00
==========================
Wagtail API v2 Usage Guide
==========================
The Wagtail API module exposes a public, read only, JSON-formatted API which
can be used by external clients (such as a mobile app) or the site's frontend.
This document is intended for developers using the API exposed by Wagtail. For
documentation on how to enable the API module in your Wagtail site, see
:doc:`/advanced_topics/api/v2/configuration`
.. contents::
Fetching content
================
To fetch content over the API, perform a ``GET`` request against one of the
following endpoints:
Fix documentation indentation Fix code block indentation in tutorial.rst Prevent it from being displayed as a quote. Fix indentation in pages.rst Fix indentation in indexing.rst Fix indentation in searching.rst Fix indentation in backends.rst Fix indentation in renditions.rst Fix indentation in custom_image_model.rst Fix indentation in feature_detection.rst Fix indentation in image_serve_view.rst Fix indentation in custom_document_model.rst Fix indentation in i18n.rst Fix indentation in privacy.rst Fix indentation in page_editing_interface.rst Fix indentation in rich_text_internals.rst Fix indentation in extending_hallo.rst Fix indentation in configuration.rst Fix indentation in usage.rst Fix indentation in theory.rst Fix indentation in model_reference.rst Fix indentation in queryset_reference.rst Configure editors to indent .rst files with 2 spaces In order for the documentation to be styled correctly, the generator depends on indentation. Too much indentation can result in the content being wrapped in a quote block, which looks bad. Fix indentation in sitemaps.rst Fix indentation in frontendcache.rst Fix indentation in routablepage.rst Fix indentation in table_block.rst Fix routablepage.rst autodocs disppearing Fix indentation in table_block.rst Fix indentation in redirects.rst Fix indentation in table_documentation-modes.rst Fix indentation in browser_issues.rst Fix indentation in release_process.rst Fix indentation of release notes One more indent fix in the release notes Fix indentation warnings Fix warning about undefined label in docs Error during `make html`: wagtail/docs/releases/1.7.rst:25: WARNING: undefined label: jpeg_image_quality
2021-02-05 12:02:05 +01:00
- Pages ``/api/v2/pages/``
- Images ``/api/v2/images/``
- Documents ``/api/v2/documents/``
2016-09-22 12:15:18 +02:00
.. note::
The available endpoints and their URLs may vary from site to site, depending
on how the API has been configured.
Example response
----------------
Each response contains the list of items (``items``) and the total count
(``meta.total_count``). The total count is irrespective of pagination.
.. code-block:: text
GET /api/v2/endpoint_name/
HTTP 200 OK
Content-Type: application/json
{
"meta": {
"total_count": "total number of results"
},
"items": [
{
"id": 1,
"meta": {
"type": "app_name.ModelName",
"detail_url": "http://api.example.com/api/v2/endpoint_name/1/"
},
"field": "value"
},
{
"id": 2,
"meta": {
"type": "app_name.ModelName",
"detail_url": "http://api.example.com/api/v2/endpoint_name/2/"
},
"field": "different value"
}
]
}
.. _apiv2_custom_page_fields:
Custom page fields in the API
-----------------------------
Wagtail sites contain many page types, each with their own set of fields. The
``pages`` endpoint will only expose the common fields by default (such as
``title`` and ``slug``).
To access custom page fields with the API, select the page type with the
``?type`` parameter. This will filter the results to only include pages of that
type but will also make all the exported custom fields for that type available
in the API.
For example, to access the ``published_date``, ``body`` and ``authors`` fields
on the ``blog.BlogPage`` model in the :ref:`configuration docs <apiv2_page_fields_configuration>`:
.. code-block:: text
GET /api/v2/pages/?type=blog.BlogPage&fields=published_date,body,authors(name)
HTTP 200 OK
Content-Type: application/json
{
"meta": {
"total_count": 10
},
"items": [
{
"id": 1,
"meta": {
"type": "blog.BlogPage",
"detail_url": "http://api.example.com/api/v2/pages/1/",
"html_url": "http://www.example.com/blog/my-blog-post/",
"slug": "my-blog-post",
"first_published_at": "2016-08-30T16:52:00Z"
},
"title": "Test blog post",
"published_date": "2016-08-30",
"authors": [
{
"id": 1,
"meta": {
"type": "blog.BlogPageAuthor",
},
"name": "Karl Hobley"
}
]
},
...
]
}
.. note::
Only fields that have been explicitly exported by the developer may be used
in the API. This is done by adding a ``api_fields`` attribute to the page
model. You can read about configuration :ref:`here <apiv2_page_fields_configuration>`.
This doesn't apply to images/documents as there is only one model exposed in
those endpoints. But for projects that have customised image/document models,
the ``api_fields`` attribute can be used to export any custom fields into the
API.
Pagination
----------
The number of items in the response can be changed by using the ``?limit``
parameter (default: 20) and the number of items to skip can be changed by using
the ``?offset`` parameter.
For example:
.. code-block:: text
GET /api/v2/pages/?offset=20&limit=20
HTTP 200 OK
Content-Type: application/json
{
"meta": {
"total_count": 50
},
"items": [
pages 20 - 40 will be listed here.
]
}
.. note::
There may be a maximum value for the ``?limit`` parameter. This can be
modified in your project settings by setting ``WAGTAILAPI_LIMIT_MAX`` to
either a number (the new maximum value) or ``None`` (which disables maximum
value check).
Ordering
--------
The results can be ordered by any field by setting the ``?order`` parameter to
the name of the field to order by.
.. code-block:: text
GET /api/v2/pages/?order=title
HTTP 200 OK
Content-Type: application/json
{
"meta": {
"total_count": 50
},
"items": [
pages will be listed here in ascending title order (a-z)
]
}
The results will be ordered in ascending order by default. This can be changed
to descending order by prefixing the field name with a ``-`` sign.
.. code-block:: text
GET /api/v2/pages/?order=-title
HTTP 200 OK
Content-Type: application/json
{
"meta": {
"total_count": 50
},
"items": [
pages will be listed here in descending title order (z-a)
]
}
.. note::
Ordering is case-sensitive so lowercase letters are always ordered after
uppercase letters when in ascending order.
Random ordering
^^^^^^^^^^^^^^^
Passing ``random`` into the ``?order`` parameter will make results return in a
random order. If there is no caching, each request will return results in a
different order.
.. code-block:: text
GET /api/v2/pages/?order=random
HTTP 200 OK
Content-Type: application/json
{
"meta": {
"total_count": 50
},
"items": [
pages will be listed here in random order
]
}
.. note::
It's not possible to use ``?offset`` while ordering randomly because
2018-04-03 18:07:53 +02:00
consistent random ordering cannot be guaranteed over multiple requests
2016-09-22 12:15:18 +02:00
(so requests for subsequent pages may return results that also appeared in
previous pages).
Filtering
---------
Any field may be used in an exact match filter. Use the filter name as the
parameter and the value to match against.
For example, to find a page with the slug "about":
.. code-block:: text
GET /api/v2/pages/?slug=about
HTTP 200 OK
Content-Type: application/json
{
"meta": {
"total_count": 1
},
"items": [
{
"id": 10,
"meta": {
"type": "standard.StandardPage",
"detail_url": "http://api.example.com/api/v2/pages/10/",
"html_url": "http://www.example.com/about/",
"slug": "about",
"first_published_at": "2016-08-30T16:52:00Z"
},
"title": "About"
},
]
}
2021-04-22 18:29:24 +02:00
.. _apiv2_filter_by_tree_position:
2016-09-22 12:15:18 +02:00
Filtering by tree position (pages only)
---------------------------------------
Pages can additionally be filtered by their relation to other pages in the tree.
2016-09-22 12:15:18 +02:00
The ``?child_of`` filter takes the id of a page and filters the list of results
to contain only direct children of that page.
For example, this can be useful for constructing the main menu, by passing the
id of the homepage to the filter:
.. code-block:: text
GET /api/v2/pages/?child_of=2&show_in_menus=true
HTTP 200 OK
Content-Type: application/json
{
"meta": {
"total_count": 5
},
"items": [
{
"id": 3,
"meta": {
"type": "blog.BlogIndexPage",
"detail_url": "http://api.example.com/api/v2/pages/3/",
"html_url": "http://www.example.com/blog/",
"slug": "blog",
"first_published_at": "2016-09-21T13:54:00Z"
},
"title": "About"
},
{
"id": 10,
"meta": {
"type": "standard.StandardPage",
"detail_url": "http://api.example.com/api/v2/pages/10/",
"html_url": "http://www.example.com/about/",
"slug": "about",
"first_published_at": "2016-08-30T16:52:00Z"
},
"title": "About"
},
...
]
}
The ``?ancestor_of`` filter takes the id of a page and filters the list
to only include ancestors of that page (parent, grandparent etc.) all the
way down to the site's root page.
For example, when combined with the ``type`` filter it can be used to
find the particular ``blog.BlogIndexPage`` a ``blog.BlogPage`` belongs
to. By itself, it can be used to to construct a breadcrumb trail from
the current page back to the site's root page.
The ``?descendant_of`` filter takes the id of a page and filter the list
to only include descendants of that page (children, grandchildren etc.).
2016-09-22 12:15:18 +02:00
Search
------
Passing a query to the ``?search`` parameter will perform a full-text search on
the results.
The query is split into "terms" (by word boundary), then each term is normalised
(lowercased and unaccented).
For example: ``?search=James+Joyce``
Search operator
^^^^^^^^^^^^^^^
The ``search_operator`` specifies how multiple terms in the query should be
handled. There are two possible values:
Fix documentation indentation Fix code block indentation in tutorial.rst Prevent it from being displayed as a quote. Fix indentation in pages.rst Fix indentation in indexing.rst Fix indentation in searching.rst Fix indentation in backends.rst Fix indentation in renditions.rst Fix indentation in custom_image_model.rst Fix indentation in feature_detection.rst Fix indentation in image_serve_view.rst Fix indentation in custom_document_model.rst Fix indentation in i18n.rst Fix indentation in privacy.rst Fix indentation in page_editing_interface.rst Fix indentation in rich_text_internals.rst Fix indentation in extending_hallo.rst Fix indentation in configuration.rst Fix indentation in usage.rst Fix indentation in theory.rst Fix indentation in model_reference.rst Fix indentation in queryset_reference.rst Configure editors to indent .rst files with 2 spaces In order for the documentation to be styled correctly, the generator depends on indentation. Too much indentation can result in the content being wrapped in a quote block, which looks bad. Fix indentation in sitemaps.rst Fix indentation in frontendcache.rst Fix indentation in routablepage.rst Fix indentation in table_block.rst Fix routablepage.rst autodocs disppearing Fix indentation in table_block.rst Fix indentation in redirects.rst Fix indentation in table_documentation-modes.rst Fix indentation in browser_issues.rst Fix indentation in release_process.rst Fix indentation of release notes One more indent fix in the release notes Fix indentation warnings Fix warning about undefined label in docs Error during `make html`: wagtail/docs/releases/1.7.rst:25: WARNING: undefined label: jpeg_image_quality
2021-02-05 12:02:05 +01:00
- ``and`` - All terms in the search query (excluding stop words) must exist in
each result
- ``or`` - At least one term in the search query must exist in each result
2016-09-22 12:15:18 +02:00
The ``or`` operator is generally better than ``and`` as it allows the user to be
inexact with their query and the ranking algorithm will make sure that
irrelevant results are not returned at the top of the page.
The default search operator depends on whether the search engine being used by
the site supports ranking. If it does (Elasticsearch), the operator will default
to ``or``. Otherwise (database), it will default to ``and``.
For the same reason, it's also recommended to use the ``and`` operator when
using ``?search`` in conjunction with ``?order`` (as this disables ranking).
For example: ``?search=James+Joyce&order=-first_published_at&search_operator=and``
.. _apiv2_i18n_filters:
Special filters for internationalised sites
-------------------------------------------
When ``WAGTAIL_I18N_ENABLED`` is set to ``True`` (see
:ref:`enabling_internationalisation` for more details) two new filters are made
available on the pages endpoint.
Filtering pages by locale
^^^^^^^^^^^^^^^^^^^^^^^^^
The ``?locale=`` filter is used to filter the listing to only include pages in
the specified locale. For example:
.. code-block:: text
GET /api/v2/pages/?locale=en-us
HTTP 200 OK
Content-Type: application/json
{
"meta": {
"total_count": 5
},
"items": [
{
"id": 10,
"meta": {
"type": "standard.StandardPage",
"detail_url": "http://api.example.com/api/v2/pages/10/",
"html_url": "http://www.example.com/usa-page/",
"slug": "usa-page",
"first_published_at": "2016-08-30T16:52:00Z",
"locale": "en-us"
},
"title": "American page"
},
...
]
}
Getting translations of a page
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The ``?translation_of`` filter is used to filter the listing to only include
pages that are a translation of the specified page ID. For example:
.. code-block:: text
GET /api/v2/pages/?translation_of=10
HTTP 200 OK
Content-Type: application/json
{
"meta": {
"total_count": 2
},
"items": [
{
"id": 11,
"meta": {
"type": "standard.StandardPage",
"detail_url": "http://api.example.com/api/v2/pages/11/",
"html_url": "http://www.example.com/gb-page/",
"slug": "gb-page",
"first_published_at": "2016-08-30T16:52:00Z",
"locale": "en-gb"
},
"title": "British page"
},
{
"id": 12,
"meta": {
"type": "standard.StandardPage",
"detail_url": "http://api.example.com/api/v2/pages/12/",
"html_url": "http://www.example.com/fr-page/",
"slug": "fr-page",
"first_published_at": "2016-08-30T16:52:00Z",
"locale": "fr"
},
"title": "French page"
},
]
}
2016-09-22 12:15:18 +02:00
Fields
------
By default, only a subset of the available fields are returned in the response.
The ``?fields`` parameter can be used to both add additional fields to the
response and remove default fields that you know you won't need.
Additional fields
^^^^^^^^^^^^^^^^^
Additional fields can be added to the response by setting ``?fields`` to a
comma-separated list of field names you want to add.
For example, ``?fields=body,feed_image`` will add the ``body`` and ``feed_image``
fields to the response.
This can also be used across relationships. For example,
``?fields=body,feed_image(width,height)`` will nest the ``width`` and ``height``
of the image in the response.
All fields
^^^^^^^^^^
Setting ``?fields`` to an asterisk (``*``) will add all available fields to the
response. This is useful for discovering what fields have been exported.
For example: ``?fields=*``
Removing fields
^^^^^^^^^^^^^^^
Fields you know that you do not need can be removed by prefixing the name with a
``-`` and adding it to ``?fields``.
For example, ``?fields=-title,body`` will remove ``title`` and add ``body``.
This can also be used with the asterisk. For example, ``?fields=*,-body``
adds all fields except for ``body``.
Removing all default fields
^^^^^^^^^^^^^^^^^^^^^^^^^^^
To specify exactly the fields you need, you can set the first item in fields to
an underscore (``_``) which removes all default fields.
For example, ``?fields=_,title`` will only return the title field.
Detail views
------------
You can retrieve a single object from the API by appending its id to the end of
the URL. For example:
- Pages ``/api/v2/pages/1/``
- Images ``/api/v2/images/1/``
- Documents ``/api/v2/documents/1/``
All exported fields will be returned in the response by default. You can use the
``?fields`` parameter to customise which fields are shown.
For example: ``/api/v2/pages/1/?fields=_,title,body`` will return just the
2016-09-22 12:15:18 +02:00
``title`` and ``body`` of the page with the id of 1.
.. _apiv2_finding_pages_by_path:
Finding pages by HTML path
--------------------------
You can find an individual page by its HTML path using the ``/api/v2/pages/find/?html_path=<path>`` view.
This will return either a ``302`` redirect response to that page's detail view, or a ``404`` not found response.
For example: ``/api/v2/pages/find/?html_path=/`` always redirects to the homepage of the site
2016-09-22 12:15:18 +02:00
Default endpoint fields
=======================
Common fields
-------------
These fields are returned by every endpoint.
.. glossary::
``id`` (number)
The unique ID of the object
.. note::
Except for page types, every other content type has its own id space
so you must combine this with the ``type`` field in order to get a
unique identifier for an object.
``type`` (string)
The type of the object in ``app_label.ModelName`` format
``detail_url`` (string)
The URL of the detail view for the object
Pages
-----
.. glossary::
``title`` (string)
``meta.slug`` (string)
``meta.show_in_menus`` (boolean)
``meta.seo_title`` (string)
``meta.search_description`` (string)
``meta.first_published_at`` (date/time)
These values are taken from their corresponding fields on the page
``meta.html_url`` (string)
If the site has an HTML frontend that's generated by Wagtail, this
field will be set to the URL of this page
``meta.parent``
Nests some information about the parent page (only available on detail
views)
Images
------
.. glossary::
``title`` (string)
The value of the image's title field. Within Wagtail, this is used in
the image's ``alt`` HTML attribute.
``width`` (number)
``height`` (number)
The size of the original image file
``meta.tags`` (list of strings)
A list of tags associated with the image
Documents
---------
.. glossary::
``title`` (string)
The value of the document's title field
``meta.tags`` (list of strings)
A list of tags associated with the document
``meta.download_url`` (string)
A URL to the document file
Changes since v1
================
Breaking changes
----------------
Fix documentation indentation Fix code block indentation in tutorial.rst Prevent it from being displayed as a quote. Fix indentation in pages.rst Fix indentation in indexing.rst Fix indentation in searching.rst Fix indentation in backends.rst Fix indentation in renditions.rst Fix indentation in custom_image_model.rst Fix indentation in feature_detection.rst Fix indentation in image_serve_view.rst Fix indentation in custom_document_model.rst Fix indentation in i18n.rst Fix indentation in privacy.rst Fix indentation in page_editing_interface.rst Fix indentation in rich_text_internals.rst Fix indentation in extending_hallo.rst Fix indentation in configuration.rst Fix indentation in usage.rst Fix indentation in theory.rst Fix indentation in model_reference.rst Fix indentation in queryset_reference.rst Configure editors to indent .rst files with 2 spaces In order for the documentation to be styled correctly, the generator depends on indentation. Too much indentation can result in the content being wrapped in a quote block, which looks bad. Fix indentation in sitemaps.rst Fix indentation in frontendcache.rst Fix indentation in routablepage.rst Fix indentation in table_block.rst Fix routablepage.rst autodocs disppearing Fix indentation in table_block.rst Fix indentation in redirects.rst Fix indentation in table_documentation-modes.rst Fix indentation in browser_issues.rst Fix indentation in release_process.rst Fix indentation of release notes One more indent fix in the release notes Fix indentation warnings Fix warning about undefined label in docs Error during `make html`: wagtail/docs/releases/1.7.rst:25: WARNING: undefined label: jpeg_image_quality
2021-02-05 12:02:05 +01:00
- The results list in listing responses has been renamed to ``items`` (was
previously either ``pages``, ``images`` or ``documents``)
2016-09-22 12:15:18 +02:00
Major features
--------------
Fix documentation indentation Fix code block indentation in tutorial.rst Prevent it from being displayed as a quote. Fix indentation in pages.rst Fix indentation in indexing.rst Fix indentation in searching.rst Fix indentation in backends.rst Fix indentation in renditions.rst Fix indentation in custom_image_model.rst Fix indentation in feature_detection.rst Fix indentation in image_serve_view.rst Fix indentation in custom_document_model.rst Fix indentation in i18n.rst Fix indentation in privacy.rst Fix indentation in page_editing_interface.rst Fix indentation in rich_text_internals.rst Fix indentation in extending_hallo.rst Fix indentation in configuration.rst Fix indentation in usage.rst Fix indentation in theory.rst Fix indentation in model_reference.rst Fix indentation in queryset_reference.rst Configure editors to indent .rst files with 2 spaces In order for the documentation to be styled correctly, the generator depends on indentation. Too much indentation can result in the content being wrapped in a quote block, which looks bad. Fix indentation in sitemaps.rst Fix indentation in frontendcache.rst Fix indentation in routablepage.rst Fix indentation in table_block.rst Fix routablepage.rst autodocs disppearing Fix indentation in table_block.rst Fix indentation in redirects.rst Fix indentation in table_documentation-modes.rst Fix indentation in browser_issues.rst Fix indentation in release_process.rst Fix indentation of release notes One more indent fix in the release notes Fix indentation warnings Fix warning about undefined label in docs Error during `make html`: wagtail/docs/releases/1.7.rst:25: WARNING: undefined label: jpeg_image_quality
2021-02-05 12:02:05 +01:00
- The ``fields`` parameter has been improved to allow removing fields, adding
all fields and customising nested fields
2016-09-22 12:15:18 +02:00
Minor features
--------------
Fix documentation indentation Fix code block indentation in tutorial.rst Prevent it from being displayed as a quote. Fix indentation in pages.rst Fix indentation in indexing.rst Fix indentation in searching.rst Fix indentation in backends.rst Fix indentation in renditions.rst Fix indentation in custom_image_model.rst Fix indentation in feature_detection.rst Fix indentation in image_serve_view.rst Fix indentation in custom_document_model.rst Fix indentation in i18n.rst Fix indentation in privacy.rst Fix indentation in page_editing_interface.rst Fix indentation in rich_text_internals.rst Fix indentation in extending_hallo.rst Fix indentation in configuration.rst Fix indentation in usage.rst Fix indentation in theory.rst Fix indentation in model_reference.rst Fix indentation in queryset_reference.rst Configure editors to indent .rst files with 2 spaces In order for the documentation to be styled correctly, the generator depends on indentation. Too much indentation can result in the content being wrapped in a quote block, which looks bad. Fix indentation in sitemaps.rst Fix indentation in frontendcache.rst Fix indentation in routablepage.rst Fix indentation in table_block.rst Fix routablepage.rst autodocs disppearing Fix indentation in table_block.rst Fix indentation in redirects.rst Fix indentation in table_documentation-modes.rst Fix indentation in browser_issues.rst Fix indentation in release_process.rst Fix indentation of release notes One more indent fix in the release notes Fix indentation warnings Fix warning about undefined label in docs Error during `make html`: wagtail/docs/releases/1.7.rst:25: WARNING: undefined label: jpeg_image_quality
2021-02-05 12:02:05 +01:00
- ``html_url``, ``slug``, ``first_published_at``, ``expires_at`` and
``show_in_menus`` fields have been added to the pages endpoint
- ``download_url`` field has been added to the documents endpoint
- Multiple page types can be specified in ``type`` parameter on pages endpoint
- ``true`` and ``false`` may now be used when filtering boolean fields
- ``order`` can now be used in conjunction with ``search``
- ``search_operator`` parameter was added