Spec-Zone.ru › Wagtail 3

Руководство по использованию Wagtail API v2

Модуль Wagtail API предоставляет общедоступный, только для чтения, API в формате JSON, который может использоваться внешними клиентами (например, мобильным приложением) или фронтендом сайта.

Этот документ предназначен для разработчиков, использующих API, предоставляемый Wagtail. Для получения информации о том, как включить модуль API в ваш сайт Wagtail, см. Руководство по конфигурации Wagtail API v2

  • Получение контента

    • Пример ответа
    • Пользовательские поля страницы в API
    • Пагинация
    • Сортировка

      • Случайная сортировка
    • Фильтрация
    • Фильтрация по положению в дереве (только страницы)
    • Поиск

      • Оператор поиска
    • Специальные фильтры для интернационализированных сайтов

      • Фильтрация страниц по языку
      • Получение переводов страницы
    • Поля

      • Дополнительные поля
      • Все поля
      • Удаление полей
      • Удаление всех стандартных полей
    • Подробные представления
    • Поиск страниц по HTML пути
  • Поля стандартных конечных точек

    • Общие поля
    • Страницы
    • Изображения
    • Документы
  • Изменения с версии v1

    • Критические изменения
    • Основные функции
    • Дополнительные функции

Получение контента

Для получения контента через API выполните запрос GET к одному из следующих конечных пунктов:

  • Страницы /api/v2/pages/
  • Изображения /api/v2/images/
  • Документы /api/v2/documents/

Примечание

Доступные конечные точки и их URL могут отличаться в зависимости от сайта, в зависимости от того, как настроен API.

Пример ответа

Каждый ответ содержит список элементов (items) и общее количество (meta.total_count). Общее количество не зависит от пагинации.

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"
        }
    ]
}

Настраиваемые поля страниц в API

Сайты Wagtail содержат множество типов страниц, каждый со своим набором полей. Конечная точка pages по умолчанию будет отображать только общие поля (такие как title и slug).

Для доступа к настраиваемым полям страниц с помощью API выберите тип страницы с параметром ?type. Это отфильтрует результаты, чтобы включить только страницы этого типа, но также сделает все экспортированные настраиваемые поля для этого типа доступными в API.

Например, для доступа к полям published_date, body и authors в модели blog.BlogPage в документации по конфигурации:

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"
                }
            ]
        },

        ...
    ]
}

Примечание

Только поля, которые были явно экспортированы разработчиком, могут использоваться в API. Это делается путем добавления атрибута api_fields к модели страницы. Вы можете узнать больше о конфигурации здесь.

Это не относится к изображениям/документам, так как в этих конечных точках представлена только одна модель. Но для проектов, которые имеют настраиваемые модели изображений/документов, атрибут api_fields может быть использован для экспорта любых настраиваемых полей в API.

Пагинация

Количество элементов в ответе можно изменить, используя параметр ?limit (по умолчанию: 20), а количество элементов, которые нужно пропустить, можно изменить, используя параметр ?offset.

Например:

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.
    ]
}

Примечание

Может быть максимальное значение для параметра ?limit. Это можно изменить в настройках вашего проекта, установив WAGTAILAPI_LIMIT_MAX либо на число (новое максимальное значение), либо на None (что отключает проверку максимального значения).

Сортировка

Результаты можно отсортировать по любому полю, установив параметр ?order на имя поля для сортировки.

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)
    ]
}

По умолчанию результаты будут отсортированы по возрастанию. Это можно изменить на убывание, добавив знак - перед именем поля.

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)
    ]
}

Примечание

Сортировка чувствительна к регистру, поэтому строчные буквы всегда будут упорядочены после заглавных букв при сортировке по возрастанию.

Случайная сортировка

Передача random в параметр ?order приведет к тому, что результаты будут возвращены в случайном порядке. Если кэширования нет, каждый запрос вернет результаты в другом порядке.

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
    ]
}

Примечание

Невозможно использовать ?offset при случайной сортировке, потому что гарантировать согласованный случайный порядок при нескольких запросах нельзя (поэтому запросы на последующие страницы могут возвращать результаты, которые также появлялись на предыдущих страницах).

Фильтрация

Любое поле можно использовать в фильтре точного совпадения. Используйте имя фильтра в качестве параметра и значение для сопоставления.

Например, чтобы найти страницу со слагом «о нас»:

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"
        },
    ]
}

Фильтрация по положению в дереве (только страницы)

Страницы также могут быть отфильтрованы по их отношению к другим страницам в дереве.

Фильтр ?child_of принимает ID страницы и фильтрует список результатов, чтобы содержать только прямых потомков этой страницы.

Например, это может быть полезно для построения основного меню, передав ID домашней страницы в фильтр:

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"
        },

        ...
    ]
}

Фильтр ?ancestor_of принимает ID страницы и фильтрует список, чтобы включить только предков этой страницы (родителя, прародителя и т. д.) до корневой страницы сайта.

Например, в сочетании с фильтром type он может быть использован для поиска конкретной blog.BlogIndexPage страницы blog.BlogPage принадлежности. Сам по себе он может быть использован для построения навигационной цепочки от текущей страницы к корневой странице сайта.

Фильтр ?descendant_of принимает ID страницы и фильтрует список, чтобы включить только потомков этой страницы (детей, внуков и т. д.).

Поиск

Передача запроса в параметр ?search выполнит полнотекстовый поиск по результатам.

Запрос разбивается на «термины» (по границам слов), а затем каждый термин нормализуется (приводится к нижнему регистру и без диакритики).

Например: ?search=James+Joyce

Оператор поиска

search_operator определяет, как должны обрабатываться несколько терминов в запросе. Есть два возможных значения:

  • and — Все термины в поисковом запросе (исключая стоп-слова) должны присутствовать в каждом результате
  • or — Хотя бы один термин в поисковом запросе должен присутствовать в каждом результате

Оператор or обычно лучше, чем and, так как он позволяет пользователю быть неточным в запросе, а алгоритм ранжирования позаботится о том, чтобы нерелевантные результаты не отображались в верхней части страницы.

Оператор по умолчанию зависит от того, поддерживает ли поисковый движок, используемый сайтом, ранжирование. Если поддерживает (Elasticsearch), оператор по умолчанию будет or. В противном случае (база данных), он будет по умолчанию and.

По той же причине, рекомендуется использовать оператор and при использовании ?search в сочетании с ?order (так как это отключает ранжирование).

Например: ?search=James+Joyce&order=-first_published_at&search_operator=and

Специальные фильтры для интернационализированных сайтов

Когда WAGTAIL_I18N_ENABLED установлено в True (см. Включение интернационализации для получения более подробной информации), на конечной точке страниц становятся доступны два новых фильтра.

Фильтрация страниц по локализации

Фильтр ?locale= используется для фильтрации списка, чтобы включить только страницы в указанной локализации. Например:

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"
        },

        ...
    ]
}

Получение переводов страницы

Фильтр ?translation_of используется для фильтрации списка, чтобы включить только страницы, которые являются переводом указанного идентификатора страницы. Например:

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"
        },
    ]
}

Поля

По умолчанию в ответе возвращается только подмножество доступных полей. Параметр ?fields может использоваться для добавления дополнительных полей в ответ и удаления полей по умолчанию, которые вам не нужны.

Дополнительные поля

Дополнительные поля могут быть добавлены в ответ, установив ?fields в список полей, разделенных запятыми, которые вы хотите добавить.

Например, ?fields=body,feed_image добавит поля body и feed_image в ответ.

Это также можно использовать через отношения. Например, ?fields=body,feed_image(width,height) вложит поля width и height изображения в ответ.

Все поля

Установка ?fields на звездочку (*) добавит все доступные поля в ответ. Это полезно для определения экспортированных полей.

Например: ?fields=*

Удаление полей

Поля, в которых вы не нуждаетесь, можно удалить, добавив префикс - к имени и поместив их в ?fields.

Например, ?fields=-title,body удалит title и добавит body.

Это также можно использовать со звездочкой. Например, ?fields=*,-body добавляет все поля, кроме body.

Удаление всех полей по умолчанию

Чтобы указать именно необходимые поля, вы можете установить первое поле в fields на подчеркивание (_). Это удалит все поля по умолчанию.

Например, ?fields=_,title вернёт только поле title.

Подробные представления

Вы можете получить отдельный объект из API, добавив его ID в конец URL. Например:

  • Страницы /api/v2/pages/1/
  • Изображения /api/v2/images/1/
  • Документы /api/v2/documents/1/

По умолчанию в ответе будут возвращаться все экспортированные поля. Вы можете использовать параметр ?fields для настройки отображаемых полей.

Например, /api/v2/pages/1/?fields=_,title,body вернёт только поля title и body страницы с ID 1.

Поиск страниц по HTML пути

Вы можете найти отдельную страницу по её HTML пути, используя представление /api/v2/pages/find/?html_path=<path>.

Это вернёт либо ответ с перенаправлением 302 на страницу с детальным представлением, либо ответ 404 об отсутствии страницы.

Например: /api/v2/pages/find/?html_path=/ всегда перенаправляет на главную страницу сайта

Поля по умолчанию для конечных точек

Общие поля

Эти поля возвращаются каждой конечной точкой.

Страницы

Изображения

Документы

END_OF_DOCUMENT_MARKER

Изменения с версии v1

Критические изменения

  • Список результатов в ответах на запросы был переименован в items (ранее он был pages, images или documents)

Основные возможности

  • Параметр fields был улучшен, чтобы позволить удалять поля, добавлять все поля и настраивать вложенные поля

Незначительные возможности

  • html_url, slug, first_published_at, expires_at и show_in_menus поля были добавлены в конечную точку страниц
  • download_url поле было добавлено в конечную точку документов
  • Несколько типов страниц можно указать в параметре type в конечной точке страниц
  • true и false теперь можно использовать при фильтрации полей булевого типа
  • order теперь можно использовать совместно с search
  • search_operator параметр был добавлен

© 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/api/v2/usage.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API