Встроенное содержимое
Wagtail поддерживает генерацию кода вставки из URL-адресов содержимого на внешних поставщиках, таких как YouTube или Twitter. По умолчанию Wagtail будет извлекать код вставки непосредственно с сайта соответствующего поставщика с помощью протокола oEmbed.
Wagtail имеет встроенный список наиболее распространённых поставщиков, и этот список можно изменить с помощью настройки. Wagtail также поддерживает извлечение кода вставки с помощью Embedly и собственных модулей поиска вставки.
Вставка содержимого на ваш сайт
Модуль вставки Wagtail должен работать сразу же для большинства поставщиков. Вы можете использовать любой из следующих методов для вызова модуля:
Редактор rich text
Встроенный редактор rich text Wagtail имеет значок «медиа», который позволяет вставлять вставки в rich text. Вам ничего не нужно делать, чтобы включить это; просто убедитесь, что содержимое поля rich text передаётся через фильтр |richtext в шаблоне, так как это вызывает модуль вставки для извлечения и вложения кода вставки.
EmbedBlock Тип блока StreamField
Тип блока EmbedBlock позволяет вставлять вставки в StreamField.
Аргументы max_width и max_height отправляются поставщику при извлечении кода вставки.
Например:
from wagtail.embeds.blocks import EmbedBlock
class MyStreamField(blocks.StreamBlock):
...
embed = EmbedBlock(max_width=800, max_height=400)
{% embed %} тег
Синтаксис: {% embed <url> [max_width=<max width>] %}
Вы можете вложить вставки в шаблон, передав URL-адрес и необязательный аргумент max_width в тег {% embed %}.
Аргумент max_width отправляется поставщику при извлечении кода вставки.
{% load wagtailembeds_tags %}
{# Embed a YouTube video #}
{% embed 'https://www.youtube.com/watch?v=Ffu-2jEdLPw' %}
{# This tag can also take the URL from a variable #}
{% embed page.video_url %}
Из Python
Вы также можете вызвать внутреннюю функцию get_embed, которая принимает строку URL-адреса и возвращает объект Embed (см. документацию модели ниже). Она также принимает необязательный аргумент max_width, который отправляется поставщику при извлечении кода вставки.
from wagtail.embeds.embeds import get_embed
from wagtail.embeds.exceptions import EmbedException
try:
embed = get_embed('https://www.youtube.com/watch?v=Ffu-2jEdLPw')
print(embed.html)
except EmbedException:
# Cannot find embed
pass
Настройка модулей поиска вставки
Модули поиска вставки — это модули в Wagtail, которые отвечают за создание кода вставки из URL-адреса.
Модули поиска вставки настраиваются с помощью настройки WAGTAILEMBEDS_FINDERS. Это список конфигураций модулей поиска, каждый из которых выполняется в порядке, пока один из них успешно не вернёт код вставки:
Конфигурация по умолчанию:
WAGTAILEMBEDS_FINDERS = [
{
'class': 'wagtail.embeds.finders.oembed'
}
]
oEmbed (по умолчанию)
Модуль поиска вставки по умолчанию извлекает код вставки непосредственно от поставщика контента с помощью протокола oEmbed. У Wagtail есть встроенный список поставщиков, которые все включены по умолчанию. Вы можете найти этот список поставщиков по следующей ссылке:
https://github.com/wagtail/wagtail/blob/main/wagtail/embeds/oembed_providers.py
Настройка списка поставщиков
Вы можете ограничить использование поставщиков, указав список поставщиков в конфигурации модуля поиска.
Например, эта конфигурация позволит вставлять контент только с Vimeo и YouTube. Она также добавляет пользовательского поставщика:
from wagtail.embeds.oembed_providers import youtube, vimeo
# Add a custom provider
# Your custom provider must support oEmbed for this to work. You should be
# able to find these details in the provider's documentation.
# - 'endpoint' is the URL of the oEmbed endpoint that Wagtail will call
# - 'urls' specifies which patterns
my_custom_provider = {
'endpoint': 'https://customvideosite.com/oembed',
'urls': [
'^http(?:s)?://(?:www\\.)?customvideosite\\.com/[^#?/]+/videos/.+$',
]
}
WAGTAILEMBEDS_FINDERS = [
{
'class': 'wagtail.embeds.finders.oembed',
'providers': [youtube, vimeo, my_custom_provider],
}
]
Настройка отдельного поставщика
Несколько модулей поиска вставки могут быть объединены друг с другом. Это может использоваться для настройки конфигурации для одного поставщика, не влияя на другие.
Например, вот как можно указать YouTube, чтобы он возвращал видео в HTTPS (что необходимо сделать явно для YouTube):
from wagtail.embeds.oembed_providers import youtube
WAGTAILEMBEDS_FINDERS = [
# Fetches YouTube videos but puts ``?scheme=https`` in the GET parameters
# when calling YouTube's oEmbed endpoint
{
'class': 'wagtail.embeds.finders.oembed',
'providers': [youtube],
'options': {'scheme': 'https'}
},
# Handles all other oEmbed providers the default way
{
'class': 'wagtail.embeds.finders.oembed',
}
]
Как Wagtail использует несколько модулей поиска
Если несколько поставщиков могут обработать URL-адрес (например, видео YouTube запрошено с использованием вышеуказанной конфигурации), выбирается самый верхний модуль поиска для выполнения запроса.
Wagtail не будет пытаться запустить другие модули поиска, даже если выбранный не вернул код вставки.
Facebook и Instagram
Начиная с октября 2020 года, Facebook упразднил свои общедоступные API oEmbed. Если вы хотите вставить публикации Facebook или Instagram на свой сайт, вам необходимо использовать новые аутентифицированные API. Для этого вам нужно создать учётную запись разработчика Facebook и приложение Facebook, которое включает oEmbed Product. Инструкции по созданию необходимого приложения находятся в разделах требований документации Facebook и Instagram.
Начиная с июня 2021 года, oEmbed Product был заменён на функцию oEmbed Read. Для вставки публикаций Facebook и Instagram ваше приложение должно активировать функцию oEmbed Read. Кроме того, приложение должно быть проверено и одобрено Facebook. Вы можете найти объявление в журнале изменений API.
Приложения, которые активировали продукт oEmbed до 8 июня 2021 года, должны активировать функцию чтения oEmbed и проверить своё приложение до 7 сентября 2021 года.
После получения токенов доступа к вашему приложению (ID приложения и секрет приложения), добавьте модули поиска Facebook и/или Instagram в настройку WAGTAILEMBEDS_FINDERS и настройте их с помощью ID приложения и секрета приложения из вашего приложения:
WAGTAILEMBEDS_FINDERS = [
{
'class': 'wagtail.embeds.finders.facebook',
'app_id': 'YOUR FACEBOOK APP_ID HERE',
'app_secret': 'YOUR FACEBOOK APP_SECRET HERE',
},
{
'class': 'wagtail.embeds.finders.instagram',
'app_id': 'YOUR INSTAGRAM APP_ID HERE',
'app_secret': 'YOUR INSTAGRAM APP_SECRET HERE',
},
# Handles all other oEmbed providers the default way
{
'class': 'wagtail.embeds.finders.oembed',
}
]
По умолчанию вставки Facebook и Instagram включают некоторый JavaScript, необходимый для полного отображения вставки. В некоторых случаях это может не быть желательным — например, если у вас несколько вставок Facebook, это приведёт к нескольким тегам script. Передавая 'omitscript': True в конфигурацию, вы можете указать, что эти теги script должны быть исключены из HTML-кода вставки. Обратите внимание, что вам потребуется самостоятельно загрузить этот скрипт.
Embed.ly
Embed.ly — платная служба, которая также может предоставлять вставки для сайтов, не реализующих протокол oEmbed.
Они также предоставляют некоторые полезные функции, такие как предоставление вставкам единообразного вида и общую API для воспроизведения видео, что полезно, если ваш сайт позволяет размещать видео на разных поставщиках, и вам необходимо реализовать пользовательские средства управления для них.
Wagtail имеет встроенную поддержку извлечения вставок из Embed.ly. Для её использования сначала установите пакет python Embedly python пакет.
Теперь добавьте модуль поиска вставки в настройку WAGTAILEMBEDS_FINDERS , использующий класс wagtail.embeds.finders.oembed и передайте ему свой API-ключ:
WAGTAILEMBEDS_FINDERS = [
{
'class': 'wagtail.embeds.finders.embedly',
'key': 'YOUR EMBED.LY KEY HERE'
}
]
Настраиваемые классы модулей поиска вставки
Для полного контроля вы можете создать пользовательский класс модуля поиска.
Вот примерный класс модуля поиска, который можно использовать в качестве шаблона; пожалуйста, обратитесь к документации для получения подробностей о том, что делает каждый метод:
from wagtail.embeds.finders.base import EmbedFinder
class ExampleFinder(EmbedFinder):
def __init__(self, **options):
pass
def accept(self, url):
"""
Returns True if this finder knows how to fetch an embed for the URL.
This should not have any side effects (no requests to external servers)
"""
pass
def find_embed(self, url, max_width=None):
"""
Takes a URL and max width and returns a dictionary of information about the
content to be used for embedding it on the site.
This is the part that may make requests to external APIs.
"""
# TODO: Perform the request
return {
'title': "Title of the content",
'author_name': "Author name",
'provider_name': "Provider name (eg. YouTube, Vimeo, etc)",
'type': "Either 'photo', 'video', 'link' or 'rich'",
'thumbnail_url': "URL to thumbnail image",
'width': width_in_pixels,
'height': height_in_pixels,
'html': "<h2>The Embed HTML</h2>",
}
После реализации всех этих методов вам просто нужно добавить его в настройку WAGTAILEMBEDS_FINDERS.
WAGTAILEMBEDS_FINDERS = [
{
'class': 'path.to.your.finder.class.here',
# Any other options will be passed as kwargs to the __init__ method
}
]
Модель Embed
Удаление вставок
Если ваша конфигурация вставок не сломана, удаление элементов в модели Embed безопасно. Wagtail автоматически перезаполнит записи, которые используются на сайте.
Вы можете сделать это, если вы перешли с oEmbed на Embedly или наоборот, так как код вставки, который они генерируют, может немного отличаться и привести к несоответствиям на вашем сайте.
© 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/embeds.html