Django休息框架与Djoser令牌认证令牌响应

时间:2017-12-28 07:08:31

标签: django django-rest-framework token

因为我正在使用名为djoser的第三方软件包来处理令牌身份验证。我想自定义响应。但在尝试改变之后,结果并不是我想要的。 我只想获得令牌的令牌值,而不是前面有“auth_token:”。

以下是djoser的链接:https://github.com/sunscrapers/djoser

这是我的代码:

serializer.py

class TokenCreateSerializer(serializers.Serializer):
    password = serializers.CharField(
        required=False, style={'input_type': 'password'}
    )

    default_error_messages = {
        'invalid_credentials': constants.INVALID_CREDENTIALS_ERROR,
        'inactive_account': constants.INACTIVE_ACCOUNT_ERROR,
    }

    def __init__(self, *args, **kwargs):
        super(TokenCreateSerializer, self).__init__(*args, **kwargs)
        self.user = None
        self.fields[User.USERNAME_FIELD] = serializers.CharField(
            required=False
        )

    def validate(self, attrs):
        self.user = authenticate(
            username=attrs.get(User.USERNAME_FIELD),
            password=attrs.get('password')
        )

        self._validate_user_exists(self.user)
        self._validate_user_is_active(self.user)
        return attrs

    def _validate_user_exists(self, user):
        if not user:
            self.fail('invalid_credentials')

    def _validate_user_is_active(self, user):
        if not user.is_active:
            self.fail('inactive_account')

views.py

    class TokenCreateView(utils.ActionViewMixin, generics.GenericAPIView):
    """
    Use this endpoint to obtain user authentication token.
    """
    serializer_class = settings.SERIALIZERS.token_create
    permission_classes = [permissions.AllowAny]

    def _action(self, serializer):
        token = utils.login_user(self.request, serializer.user)
        token_serializer_class = settings.SERIALIZERS.token
        return Response(
            data=token_serializer_class(token).data,
            status=status.HTTP_200_OK,
        )

我的自定义views.py

    class CustomTokenCreateView(utils.ActionViewMixin, generics.GenericAPIView):
    """
    Use this endpoint to obtain user authentication token.
    """
    serializer_class = TokenCreateSerializer
    permission_classes = [permissions.AllowAny]

    def _action(self, serializer):
        token = utils.login_user(self.request, serializer.user)
        token_serializer_class = settings.SERIALIZERS.token
        content = {
            'Token': token_serializer_class(token).data,
            'promptmsg': 'You have successfully login',
            'status': '200'
        }
        return Response(
            data=content,
            status=status.HTTP_200_OK,
        )

来自djoser令牌身份验证的结果:

成功:

{
"auth_token": "da57cd11c34cb4332eaa6cc2cac797d0ee95cafb"
}

我编辑的djoser身份验证的结果

成功:

{
    "Token": {
        "auth_token": "da57cd11c34cb4332eaa6cc2cac797d0ee95cafb"
    },
    "promptmsg": "You have successfully login",
    "status": "200"
}

我想要的结果

成功:

{
    "Token": "da57cd11c34cb4332eaa6cc2cac797d0ee95cafb",
    "promptmsg": "You have successfully login",
    "status": "200"
}

有没有办法删除auth_token标记?我不介意它的auth_token,但只要格式是预期的

1 个答案:

答案 0 :(得分:2)

尝试此操作以访问值:

content = {
        'Token': token_serializer_class(token).data["auth_token"],
        'promptmsg': 'You have successfully login',
        'status': '200'
    }

这样你就不会分配整个对象了。