dj-rest-auth несовместим с Django ReST Framework JSON API?

#django-rest-framework #django-serializer #json-api #django-rest-auth

#django-rest-framework #django-сериализатор #json-api #django-rest-auth

Вопрос:

В приложении Django (v3.1.2) ReST Framework (DRF v3.12.1) я использую расширение Django ReST Framework JSON API (DJA) (v3.2.0) для использования и создания ресурсов в формате JSON: API (приложение типа содержимого / vnd.api json). Это расширение DJA предоставляет собственный анализатор и средство визуализации JSON.

Кроме того, я выбрал dj-rest-auth (v1.1.2) для ресурсов аутентификации. Однако, похоже, он несовместим с DJA: когда я отправляю запрос на вход в формате JSON: API, например

 {
    "data": {
        "type": "LoginView",
        "attributes": {
            "username": "user",
            "password": "pwd"
        }
    }
}
  

серверу не удается отобразить ответ с исключением 'dict' object has no attribute 'pk' at ... python3.8/site-packages/rest_framework_json_api/renderers.py, line 502, in build_json_resource_obj . Отлаживая запрос, я обнаружил, что DJA ожидает, что на выходе сериализатора serializer.instance будет поле закрытого ключа ( pk ), из которого средство визуализации DJA извлекает метаданные, такие как идентификатор, который должен присутствовать в ресурсе application / vnd.api json.

У меня два вопроса:

  1. Действительно ли это несовместимость между двумя библиотеками, или я просто неправильно их комбинирую? Есть ли что-то, что мне нужно настроить, или мне нужно как-то расширить модели аутентификации?
  2. Если действительно существует фундаментальная проблема, есть ли какой-нибудь способ отключить DJA для ресурсов аутентификации? Мне кажется, что DJA можно активировать только для всего сервера Django или вообще не активировать, но его нельзя активировать только для определенного приложения Django. Есть ли способ использовать и возвращать стандартное содержимое приложения / json для конечной точки аутентификации?

Комментарии:

1. У меня нет большого опыта реализации API-интерфейсов, совместимых со спецификацией JSON API, с использованием Django. Но в целом спецификация JSON API не предназначена для использования для аутентификации и аналогичных целей. Он пытается сосредоточиться только на ресурсоемких API. Может быть, вам не стоит пытаться использовать схему документа JSON API для вашего запроса на аутентификацию?

2. Действительно, я пытался отключить функции JSON: API для аутентификации, но потерпел неудачу. Мне кажется, что django-rest-json-api — это выбор «все или ничего». Если вы случайно знаете, как выборочно отключить его, я был бы рад узнать!

Ответ №1:

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

  • Python 3.9
  • Django 3.1.2
  • Django REST Framework 3.12.1
  • Django REST Framework JSON API 4.0.0
  • DJ-REST-Auth 1.1.2