Руководство по использованию Wagtail API v2
Модуль Wagtail API предоставляет общедоступный, только для чтения, API в формате JSON, который может использоваться внешними клиентами (например, мобильным приложением) или фронтендом сайта.
Этот документ предназначен для разработчиков, использующих API, предоставляемый Wagtail. Для получения информации о том, как включить модуль API в ваш сайт Wagtail, см. Руководство по конфигурации Wagtail API v2
Получение контента
Для получения контента через 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=/ всегда перенаправляет на главную страницу сайта
Поля по умолчанию для конечных точек
Общие поля
Эти поля возвращаются каждой конечной точкой.
Страницы
Изображения
Документы
Изменения с версии 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