Django + React rest-auth - PullRequest
       50

Django + React rest-auth

1 голос
/ 28 апреля 2020

Я использую модуль rest-auth для включения аутентификации пользователя в моем веб-приложении. Хотя я сталкиваюсь с некоторыми трудностями при получении сведений о пользователе. Django -rest-framework возвращает ключ, когда я публикую свое имя пользователя и пароль, хотя этого достаточно для входа в систему, я также хочу получить дополнительную информацию, такую ​​как user.is_staff, user.username и user.email.

Я пытался использовать сериализатор Token, но я не уверен, правильно ли я это делаю.

** settings.py ** 

REST_AUTH_SERIALIZERS = {
    'TOKEN_SERIALIZER': '## How to define the path to my serializer ##',
}

** serializers.py **

from rest_framework import serializers
from lms.models.post_models import Post
from django.contrib.auth.models import User
from rest_auth.models import TokenModel    

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('username', 'email')

class TokenSerializer(serializers.ModelSerializer):
    user = UserSerializer()
    class Meta:
        model = TokenModel
        fields = ('key', 'user')

Скажите, пожалуйста, какая часть отсутствует или какая-либо часть неверна. Также, пожалуйста, помогите мне разобраться в части между ## ##.

Спасибо!

1 Ответ

1 голос
/ 28 апреля 2020

Я думаю, что вы все делаете правильно, в вашем обычае TokenSerializer вам нужно каким-то образом получить пользователя. Если я посмотрю на код LoginView, я вижу, что вы можете использовать request объект из context в сериализаторе, поэтому ваш TokenSerializer должен выглядеть следующим образом:

# serializers.py

class TokenSerializer(serializers.ModelSerializer):
    user = serializers.SerializerMethodField()

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

    def get_user(self, instance):
        request = self.context.get('request')
        return UserSerializer(request.user).data

, а затем settings.py

REST_AUTH_SERIALIZERS = {
    'TOKEN_SERIALIZER': 'project.serializers.TokenSerializer',
}


РЕДАКТИРОВАНИЕ: Это может нарушить представление вашего реестра, потому что если вы посмотрите на исходный код , в строке 60 он использует то же самое Сериализатор, но не передает объект запроса в контексте сериализатора. Вы можете заставить его работать, переопределив этот метод

# views.py

from django.conf import settings
from rest_auth.registeraion.views import RegisterView
from allauth.account import app_settings as allauth_settings
from rest_auth.app_settings import (TokenSerializer,
                                    JWTSerializer)


class CustomRegisterView(RegisterView):
    def get_response_data(self, user):
        if allauth_settings.EMAIL_VERIFICATION == \
                allauth_settings.EmailVerificationMethod.MANDATORY:
            return {"detail": _("Verification e-mail sent.")}

        if getattr(settings, 'REST_USE_JWT', False):
            data = {
                'user': user,
                'token': self.token
            }
            return JWTSerializer(data).data
        else:
            return TokenSerializer(user.auth_token, context={"request": self.request}).data

, а затем использовать это представление для регистрации в ваших URL

# urls.py
from views import CustomRegisterView


urlpatterns = [
    ...,
    url(r'^rest-auth/', include('rest_auth.urls')),
    url(r'^rest-auth/registration/', CustomRegisterView.as_view())
    ]
...