Как мне также получить данные пользователя с помощью ключа токена в HTTP-ответе на конечную точку входа в систему django rest_auth?

Я новичок в работе с django. Я разработал API для регистрации пользователей, входа в систему и выхода из системы с помощью Django Rest-Auth с использованием пользовательской модели, расширяющей AbstractUser.

Когда я вызываю POST в конечной точке API входа с использованием учетных данных, я получаю в ответ токен, пожалуйста, проверьте снимок экрана ниже.

POST в конечной точке API входа

Мне также нужно войти в данные пользователя. как это сделать!?

Подойдет любая помощь. TIA.


person pointbreak    schedule 19.07.2018    source источник
comment
Если вам не нужен токен, зачем вы его используете?   -  person JPG    schedule 20.07.2018
comment
о, извини, я ошибся. Я отредактировал свой вопрос сейчас. Мне также нужны токен и пользовательские данные.   -  person pointbreak    schedule 20.07.2018
comment
Я думаю, вам нужно переопределить эти классы и функции   -  person JPG    schedule 21.07.2018
comment
сделать еще один запрос к конечной точке, которая возвращает request.user, передав этот токен в качестве заголовка авторизации   -  person tayyab_fareed    schedule 21.07.2018


Ответы (2)


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

в файле скажем yourapp / model.py

from django.conf import settings

from rest_framework import serializers
from rest_auth.models import TokenModel
from rest_auth.utils import import_callable
from rest_auth.serializers import UserDetailsSerializer as DefaultUserDetailsSerializer

# This is to allow you to override the UserDetailsSerializer at any time.
# If you're sure you won't, you can skip this and use DefaultUserDetailsSerializer directly
rest_auth_serializers = getattr(settings, 'REST_AUTH_SERIALIZERS', {})
UserDetailsSerializer = import_callable(
    rest_auth_serializers.get('USER_DETAILS_SERIALIZER', DefaultUserDetailsSerializer)
)

class CustomTokenSerializer(serializers.ModelSerializer):
    user = UserDetailsSerializer(read_only=True)

    class Meta:
        model = TokenModel
        fields = ('key', 'user', )

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

yourapp / settings.py

.
.
.
.

REST_AUTH_SERIALIZERS = {
    'TOKEN_SERIALIZER': 'yourapp.models.CustomTokenSerializer' # import path to CustomTokenSerializer defined above.
}
person Abdulmalik Abdulwahab    schedule 26.07.2018
comment
Это отлично работает для меня, просто класс сериализатора CustomTokenSerializer, скорее всего, находится в serializers.py, чем models.py. Большое спасибо - person Greko2015 GuFn; 26.03.2021

Для этого вам необходимо реализовать собственное представление и сериализатор.

Сначала вы создаете сериализатор для ответа с ключевыми и пользовательскими данными.

Поскольку у нас нет информации о вашей модели, это всего лишь базовый пример:

class MySerializer(serializes.ModelSerializer):

    key = serializers.SerializerMethodField()

    def get_key(self, obj):
         return create_token(obj)

    class Meta:
        model=  User
        fields = ( 'id', 'username', 'key', )

здесь get_key может сгенерировать ваш токен (obj будет экземпляром вашей пользовательской модели)

Затем я предлагаю посмотреть, как django-rest-auth реализует LoginView, который вы используете для получения токена сейчас.

И вы создаете новое представление и черпаете вдохновение из реализации LoginView, чтобы понять, как получить токен. И вы используете сериализатор для создания нужного ответа.

person Enthusiast Martin    schedule 21.07.2018