Налаштування Wagtail API для Headless-режиму

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.
Розробка та обслуговування будь-яких видів сайтів:
Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Налаштування Wagtail API для Headless-режиму
Середня
~3-5 робочих днів
Часті питання
Наші компетенції:
Етапи розробки
Останні роботи
  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    874
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851

Налаштування Wagtail API для Headless-режиму

Wagtail API v2 — вбудований REST API лише для читання. Для повнофункціонального headless з мутаціями використовуйте Strawberry Django або django-graphene разом з ним.

Включення Wagtail API

# settings/base.py
INSTALLED_APPS += ['wagtail.api.v2']

# urls.py
from wagtail.api.v2.views import PagesAPIViewSet
from wagtail.api.v2.router import WagtailAPIRouter
from wagtail.images.api.v2.views import ImagesAPIViewSet
from wagtail.documents.api.v2.views import DocumentsAPIViewSet

api_router = WagtailAPIRouter('wagtailapi')
api_router.register_endpoint('pages',     PagesAPIViewSet)
api_router.register_endpoint('images',    ImagesAPIViewSet)
api_router.register_endpoint('documents', DocumentsAPIViewSet)

urlpatterns = [
    path('api/v2/', api_router.urls),
    path('',        include(wagtail_urls)),
]

Кастомізація API ViewSet

# blog/api.py
from wagtail.api.v2.views import PagesAPIViewSet
from wagtail.api.v2.filters import FieldsFilter, OrderingFilter, SearchFilter

class BlogPostAPIViewSet(PagesAPIViewSet):
    # Дозволені поля для фільтрації
    filter_backends = [FieldsFilter, OrderingFilter, SearchFilter]

    # Поля доступні через API
    body_fields = PagesAPIViewSet.body_fields + [
        'intro', 'date', 'tags', 'categories',
    ]
    meta_fields  = PagesAPIViewSet.meta_fields + [
        'first_published_at',
    ]
    listing_default_fields = PagesAPIViewSet.listing_default_fields + [
        'intro', 'date',
    ]

    def get_queryset(self):
        return BlogPost.objects.live().public()


# Реєстрація кастомного endpoint
api_router.register_endpoint('blog-posts', BlogPostAPIViewSet)

Запити до API

const BASE = process.env.WAGTAIL_URL;

// Список сторінок певного типу
const res = await fetch(
  `${BASE}/api/v2/pages/?type=blog.BlogPost&fields=title,intro,date,slug,first_published_at,thumbnail&order=-first_published_at&limit=12`
);
const { items, meta } = await res.json();

// Одна сторінка по slug
const post = await fetch(
  `${BASE}/api/v2/pages/?slug=my-post-slug&type=blog.BlogPost&fields=*`
).then(r => r.json()).then(r => r.items[0]);

// Пошук
const results = await fetch(
  `${BASE}/api/v2/pages/?search=wagtail+tutorial&type=blog.BlogPost`
);

// Preview (вимагає окремий PreviewAPIViewSet)
const preview = await fetch(`${BASE}/api/v2/pages/preview/?content_type=blog.blogpost&token=${previewToken}`);

API зображень з трансформаціями

Wagtail API повертає URL зображень без трансформацій. Для rendition використовуйте кастомне поле:

from wagtail.api.v2.serializers import PageSerializer
from wagtail.images.shortcuts import get_rendition_or_not_found
from rest_framework import serializers

class BlogPostSerializer(PageSerializer):
    thumbnail = serializers.SerializerMethodField()

    def get_thumbnail(self, obj):
        if not obj.header_image:
            return None
        rendition = get_rendition_or_not_found(obj.header_image, 'fill-800x400-c100')
        return {
            'url':    rendition.url,
            'width':  rendition.width,
            'height': rendition.height,
            'alt':    obj.header_image.alt_text,
        }

class BlogPostAPIViewSet(PagesAPIViewSet):
    serializer_class = BlogPostSerializer

Next.js ISR + Wagtail Webhooks

Wagtail не має вбудованих webhooks. Реалізуйте через Django signals:

# blog/signals.py
from django.db.models.signals import post_save
from django.dispatch import receiver
from wagtail.signals import page_published, page_unpublished
import httpx

@receiver(page_published)
def on_page_published(sender, instance, **kwargs):
    if not hasattr(instance, 'slug'):
        return
    try:
        httpx.post(
            settings.NEXTJS_REVALIDATE_URL,
            json={'slug': instance.slug, 'type': instance.__class__.__name__},
            headers={'x-revalidate-secret': settings.NEXTJS_REVALIDATE_SECRET},
            timeout=5.0,
        )
    except Exception:
        pass
// Next.js: app/api/revalidate/route.ts
export async function POST(request: Request) {
  const { slug, type } = await request.json();
  if (type === 'BlogPost') {
    revalidatePath(`/blog/${slug}`);
    revalidatePath('/blog');
  }
  return Response.json({ revalidated: true });
}

Повна настройка Wagtail API з Next.js — 2–4 дні.