The Browsable API
Это глубоко ошибочный трюизм... что мы должны культивировать привычку думать о том, что мы делаем. Все обстоит с точностью до наоборот. Цивилизация развивается за счет увеличения числа важных операций, которые мы можем выполнять, не задумываясь о них.
— Альфред Норт Уайтхед, Введение в математику (1911)
API может означать интерфейс прикладного программирования(Application Programming Interface), но люди тоже должны уметь читать API; кто-то должен заниматься программированием. DRF поддерживает генерацию удобного для человека HTML-вывода для каждого ресурса при запросе формата HTML
. Эти страницы позволяют легко просматривать ресурсы, а также содержат формы для отправки данных на ресурсы с помощью POST
, PUT
и DELETE
.
URLs
Если вы включите в вывод ресурсов полностью определенные URL, они будут "урлизованы" и сделаны кликабельными для удобства просмотра человеком. Для этого в пакет rest_framework
включен помощник reverse
.
Форматы
По умолчанию API возвращает формат, указанный в заголовках, который в случае браузера является HTML. Формат может быть указан с помощью ?format=
в запросе, так что вы можете просмотреть необработанный JSON-ответ в браузере, добавив ?format=json
к URL. Существуют полезные расширения для просмотра JSON в Firefox и Chrome.
Аутентификация
Чтобы быстро добавить аутентификацию в Web-интерфейсе API, добавьте маршруты с именами "login"
и "logout"
в пространстве имен "rest_framework"
. DRF предоставляет для этого маршруты по умолчанию, которые вы можете добавить в свой urlconf:
urlpatterns = [
# ...
url(r"^api-auth/", include("rest_framework.urls", namespace="rest_framework"))
]
Настройка
Web-интерфейс API построен с использованием Twitter's Bootstrap (v 3.4.1), что позволяет легко настроить внешний вид и функциональность.
Чтобы настроить стиль по умолчанию, создайте шаблон rest_framework/api.html
, который расширяет rest_framework/base.html
. Например:
templates/rest_framework/api.html
<div data-gb-custom-block data-tag="extends" data-0='rest_framework/base.html'></div>
... # Override blocks with required customizations
Переопределение темы по умолчанию
Чтобы заменить тему по умолчанию, добавьте блок bootstrap_theme
в ваш api.html
и вставьте ссылку
на нужный css-файл темы Bootstrap. Это полностью заменит включенную тему.
<div data-gb-custom-block data-tag="block">
<link rel="stylesheet" href="/path/to/my/bootstrap.css" type="text/css">
</div>
Подходящие готовые темы для замены доступны на сайте Bootswatch. Чтобы использовать любую из тем Bootswatch, просто скачайте файл bootstrap.min.css
этой темы, добавьте его в свой проект и замените тему по умолчанию, как описано выше. Убедитесь, что версия Bootstrap новой темы совпадает с версией темы по умолчанию.
Вы также можете изменить вариант навигационной панели, которая по умолчанию имеет значение navbar-inverse
, с помощью блока bootstrap_navbar_variant
. Пустой блок `
` будет использовать оригинальный стиль навигационной панели Bootstrap.
Полный пример:
<div data-gb-custom-block data-tag="extends" data-0='rest_framework/base.html'></div>
<div data-gb-custom-block data-tag="block">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootswatch@3.4.1/flatly/bootstrap.min.css" type="text/css">
</div>
<div data-gb-custom-block data-tag="block"></div>
Для более специфических CSS-настроек, чем просто переопределение темы bootstrap по умолчанию, вы можете переопределить блок style
.

Скриншот темы "Cerulean"

Скриншот темы "Slate"
Пакеты сторонних разработчиков для настройки
Вы можете использовать сторонние пакеты для кастомизации, а не делать это самостоятельно. Вот 2 пакета для настройки API:
rest-framework-redesign - Пакет для настройки API с помощью Bootstrap 5. Современный и элегантный дизайн, поддержка темного режима.
rest-framework-material - Материальный дизайн для Django REST Framework.

Скриншот темы rest-framework-redesign

Скриншот темы rest-framework-material
Блоки
Все блоки, доступные в базовом шаблоне Web-интерфейса API, которые можно использовать в вашем api.html
.
body
- Весь html-тег<body>
.bodyclass
- Атрибут класса для тега<body>
, по умолчанию пустой.bootstrap_theme
- CSS для темы Bootstrap.bootstrap_navbar_variant
- CSS-класс для навигационной панели.branding
- Раздел брендирования navbar, см. Bootstrap components.breadcrumbs
- Ссылки, показывающие вложенность ресурсов, позволяющие пользователю вернуться к ним. Рекомендуется сохранять их, но их можно переопределить с помощью блока breadcrumbs.script
- Файлы JavaScript для страницы.style
- Таблицы стилей CSS для страницы.title
- Заголовок страницы.userlinks
- Список ссылок справа от заголовка, по умолчанию содержит ссылки на вход/выход. Чтобы добавить ссылки вместо замены, используйте{{ block.super }}
, чтобы сохранить ссылки аутентификации.
Компоненты
Доступны все стандартные Bootstrap-компоненты.
Всплывающие подсказки
Web-интерфейс API использует компонент Bootstrap tooltips. Любой элемент с классом js-tooltip
и атрибутом title
имеет содержание заголовка, который будет отображать всплывающую подсказку при наведении.
Шаблон для входа в систему
Чтобы добавить брендинг и настроить внешний вид шаблона входа в систему, создайте шаблон login.html
и добавьте его в свой проект, например: templates/rest_framework/login.html
. Шаблон должен расширяться от rest_framework/login_base.html
.
Вы можете добавить название своего сайта или брендинг, включив блок брендинга:
<div data-gb-custom-block data-tag="extends" data-0='rest_framework/login_base.html'></div>
<div data-gb-custom-block data-tag="block">
<h3 style="margin: 0 0 20px;">My Site Name</h3>
</div>
Вы также можете настроить стиль, добавив блок bootstrap_theme
или style
, аналогичный api.html
.
Расширенная настройка
Контекст
Контекст, доступный шаблону:
allowed_methods
: Список методов, разрешенных ресурсуapi_settings
: Настройки APIavailable_formats
: Список форматов, разрешенных ресурсомbreadcrumblist
: Список ссылок, следующих по цепочке вложенных ресурсовcontent
: Содержание ответа APIdescription
: Описание ресурса, сгенерированное из его docstringname
: Название ресурсаpost_form
: Экземпляр формы для использования POST-формой (если разрешено)put_form
: Экземпляр формы для использования PUT-формой (если разрешено)display_edit_forms
: Булево значение, указывающее, будут ли отображаться формы POST, PUT и PATCH.request
: Объект запросаresponse
: Объект ответаversion
: Версия Django REST Frameworkview
: Представление, обрабатывающее запросFORMAT_PARAM
: Представление может принимать переопределение форматаMETHOD_PARAM
: Представление может принимать переопределение метода
Вы можете переопределить метод BrowsableAPIRenderer.get_context()
, чтобы настроить контекст, передаваемый в шаблон.
Неиспользование файла base.html
Для более продвинутой настройки, например, без основы Bootstrap или более тесной интеграции с остальным сайтом, вы можете просто убрать в api.html
расширение base.html
. Тогда содержание и возможности страницы будут зависеть только от вас.
Обработка ChoiceField
с большим количеством элементов.
ChoiceField
с большим количеством элементов.Когда в отношениях или ChoiceField
слишком много элементов, рендеринг виджета, содержащего все варианты, может стать очень медленным, что приведет к плохой работе рендеринга Web-интерфейса API.
Самый простой вариант в этом случае - заменить виджет select на стандартный текстовый виджет. Например:
author = serializers.HyperlinkedRelatedField(
queryset=User.objects.all(),
style={'base_template': 'input.html'}
)
Автозаполнение
Альтернативным, но более сложным вариантом будет замена виджета ввода виджетом автозаполнения, который будет загружать и отображать только подмножество доступных вариантов по мере необходимости. Если вам нужно сделать это, вам придется потрудиться, чтобы создать собственный HTML-шаблон автозаполнения.
Существует множество пакетов для виджетов автозаполнения, например django-autocomplete-light, к которым вы можете обратиться. Обратите внимание, что вы не сможете просто включить эти компоненты в качестве стандартных виджетов, а должны будете явно написать HTML-шаблон. Это связано с тем, что REST framework 3.0 больше не поддерживает именованный аргумент widget
, так как теперь он использует шаблонизацию HTML.
Last updated
Was this helpful?