REST-фреймворк Django 3.5

Выпуск 3.5 является вторым в запланированной серии, в которой рассматриваются вопросы генерации схем, поддержки гипермедиа, клиентских библиотек API и, наконец, поддержки реального времени.


Финансирование

Выпуск 3.5 был бы невозможен без нашей collaborative funding model. Если вы используете REST framework в коммерческих целях и хотите, чтобы эта работа продолжалась, мы настоятельно рекомендуем вам инвестировать в его дальнейшее развитие путем ** <<< 1 >>** **.

:raw-html-m2r:`<ul class=»premium-promo promo»>

<li><a href=»https://www.rover.com/careers/» style=»background-image: url(https://fund-rest-framework.s3.amazonaws.com/rover_130x130.png)»>Rover.com</a></li> <li><a href=»https://sentry.io/welcome/» style=»background-image: url(https://fund-rest-framework.s3.amazonaws.com/sentry130.png)»>Sentry</a></li> <li><a href=»https://getstream.io/?utm_source=drf&utm_medium=banner&utm_campaign=drf» style=»background-image: url(https://fund-rest-framework.s3.amazonaws.com/stream-130.png)»>Stream</a></li> <li><a href=»https://www.machinalis.com/#services» style=»background-image: url(https://fund-rest-framework.s3.amazonaws.com/Machinalis130.png)»>Machinalis</a></li>

</ul>`

Большое спасибо всем нашим :doc:`sponsors <https://fund.django-rest-framework.org/topics/funding/#our-sponsors>`*, и в особенности нашим премиум бэкерам, Rover.*.


Улучшенная генерация схем

Докстринги представлений теперь протаскиваются в определения схем, позволяя вам use the schema definition to document your&nbsp;API.

Теперь есть также функция быстрого доступа get_schema_view() , которая упрощает adding schema views в вашем API.

Например, чтобы включить схему swagger в свой API, нужно сделать следующее:

  • Выполнить pip install django-rest-swagger.

  • Добавьте 'rest_framework_swagger' к настройке INSTALLED_APPS.

  • Включите представление схемы в URL conf:

from rest_framework.schemas import get_schema_view
from rest_framework_swagger.renderers import OpenAPIRenderer, SwaggerUIRenderer

schema_view = get_schema_view(
    title='Example API',
    renderer_classes=[OpenAPIRenderer, SwaggerUIRenderer]
)

urlpatterns = [
    path('swagger/', schema_view),
    ...
]

Было внесено большое количество исправлений в генерацию схем. Они должны устранить проблемы для всех, кто использует последнюю версию пакета django-rest-swagger.

Некоторые из этих изменений влияют на результирующую структуру схемы, поэтому если вы уже используете генерацию схемы, вам следует обязательно ознакомиться с :doc:`the deprecation notes <#deprecations>`** , особенно если вы используете динамическую клиентскую библиотеку для взаимодействия с вашим API.

Наконец, мы также теперь раскрываем генерацию схемы как :doc:`publicly documented API <../api-guide/schemas/#schemagenerator>`** , позволяя вам легче переопределить поведение.

Запросы тестового клиента

Теперь вы можете протестировать свой проект, используя библиотеку requests.

Это предоставляет точно такой же интерфейс, как если бы вы использовали стандартный экземпляр сессии requests.

client = RequestsClient()
response = client.get('http://testserver/users/')
assert response.status_code == 200

Вместо того чтобы отправлять HTTP-запросы в сеть, этот интерфейс будет пересылать все исходящие запросы в WSGI и вызывать ваше приложение напрямую.

Основной клиент API

Теперь вы также можете протестировать свой проект, взаимодействуя с ним с помощью клиентской библиотеки coreapi.

# Fetch the API schema
client = CoreAPIClient()
schema = client.get('http://testserver/schema/')

# Create a new organisation
params = {'name': 'MegaCorp', 'status': 'active'}
client.action(schema, ['organisations', 'create'], params)

# Ensure that the organisation exists in the listing
data = client.action(schema, ['organisations', 'list'])
assert(len(data) == 1)
assert(data == [{'name': 'MegaCorp', 'status': 'active'}])

Опять же, это вызовет непосредственно приложение, используя интерфейс WSGI, вместо того, чтобы делать фактические сетевые вызовы.

Это хороший вариант, если вы планируете, что клиенты будут в основном взаимодействовать с вашим API, используя клиентскую библиотеку coreapi или какой-либо другой автоматически сгенерированный клиент.

Живые тесты

Одним из интересных аспектов клиента requests и клиента coreapi является то, что они позволяют писать тесты таким образом, что они могут быть запущены против живого сервиса.

Переключив экземпляры клиента на базе WSGI на реальные экземпляры requests.Session или coreapi.Client, вы можете заставить тестовые примеры выполнять реальные сетевые вызовы.

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

Поддержка RAML

Теперь у нас есть предварительная поддержка RAML documentation generation.

RAML Example

Планируется дальнейшая работа над кодировкой и созданием документации, чтобы позже сделать доступными такие функции, как поддержка «Попробуй сейчас».

Эта работа также означает, что теперь вы можете использовать клиентские библиотеки Core API для взаимодействия с API, которые раскрывают спецификацию RAML. В RAML codec приведены некоторые примеры взаимодействия с API Spotify таким образом.

Валидационные коды

Исключения, возникающие в REST-фреймворке, теперь включают идентификаторы короткого кода. При использовании вместе с нашей настраиваемой обработкой ошибок это позволяет изменять стиль сообщений об ошибках API.

В качестве примера, это позволяет использовать следующий стиль ответов на ошибки:

{
    "message": "You do not have permission to perform this action.",
    "code": "permission_denied"
}

Это особенно полезно при ошибках валидации, которые используют соответствующие коды для идентификации различных видов сбоев…

{
    "name": {"message": "This field is required.", "code": "required"},
    "age": {"message": "A valid integer is required.", "code": "invalid"}
}

Поддержка загрузки и выгрузки клиентов

Клиентская библиотека Python coreapi и инструмент командной строки Core API теперь полностью поддерживают файлы uploads и downloads.


Амортизация

Генерация схем из маршрутизатора

Аргументы маршрутизатора для генерации представления схемы, такие как schema_title , в настоящее время находятся на стадии устаревания.

Вместо того, чтобы использовать DefaultRouter(schema_title='Example API') , вы должны использовать функцию get_schema_view(), и включить представление в ваш URL conf.

Обязательно указывайте вид перед урлами маршрутизатора. Например:

from rest_framework.schemas import get_schema_view
from my_project.routers import router

schema_view = get_schema_view(title='Example API')

urlpatterns = [
    path('', schema_view),
    path('', include(router.urls)),
]

Представления путей схемы

Идентификатор 'pk' в путях к схеме теперь по умолчанию отображается на фактическое имя поля модели. Обычно это будет 'id'.

Это дает лучшее внешнее представление схем, при этом раскрывается меньше деталей реализации. Это также отражает поведение при использовании класса ModelSerializer с fields = '__all__'.

Вы можете вернуться к предыдущему поведению, установив 'SCHEMA_COERCE_PATH_PK': False в настройках фреймворка REST.

Представления имен действий схемы

Внутренние имена методов retrieve() и destroy() теперь принудительно приводятся к внешнему представлению read и delete.

Вы можете вернуться к предыдущему поведению, установив 'SCHEMA_COERCE_METHOD_NAMES': {} в настройках фреймворка REST.

DjangoFilterBackend

Функциональность встроенного пакета DjangoFilterBackend теперь полностью включена в пакет django-filter.

Вы должны изменить настройки импорта и фильтра фреймворка REST следующим образом:

  • rest_framework.filters.DjangoFilterBackend становится django_filters.rest_framework.DjangoFilterBackend.

  • rest_framework.filters.FilterSet становится django_filters.rest_framework.FilterSet.

Существующие импорты будут продолжать работать, но в настоящее время они находятся на стадии устаревания.

Тип носителя CoreJSON

Медиа-тип для CoreJSON теперь application/json+coreapi , а не application/vnd.json+coreapi. Это позволяет привести его в соответствие с другими пользовательскими медиатипами, например, используемыми в Swagger и RAML.

В настоящее время клиенты принимают любой тип медиа. Старый тип мультимедиа будет устаревшим позднее.

ModelSerializer „fields“ и „exclude“

ModelSerializer и HyperlinkedModelSerializer должны включать либо опцию fields, либо опцию exclude. Для явного включения всех полей можно использовать сочетание fields = '__all__'.

Невозможность установить либо fields, либо exclude приводила к предупреждению о предстоящем обесценивании в версии 3.3 и приводила к предупреждению об обесценивании в версии 3.4. Теперь его использование является обязательным.


Вернуться на верх