【问题标题】:Django rest framework with djoser token authentication retrieve user first_name具有 djoser 令牌身份验证的 Django REST 框架检索用户 first_name
【发布时间】:2018-06-08 19:52:16
【问题描述】:

我正在使用 django rest 框架 djoser 身份验证。所以我想要的是当用户登录时,它将返回他们的用户令牌、提示消息、状态、名字和姓氏。

乔瑟:http://djoser.readthedocs.io/en/latest/introduction.html

现在我可以显示令牌、提示消息和状态,但至于名字和姓氏,我尝试这样做时出错。

序列化器

    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')

customviews.py

class CustomTokenCreateView(cutils.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["auth_token"],
            'promptmsg': 'You have successfully login',
            'status': '200',
            'first_name': self.request.user.first_name,
            'last_name': self.request.user.last_name
        }
        return Response(
            data=content,
            status=status.HTTP_200_OK,
        )

这段代码会报错:

AttributeError at /logintest/
    'AnonymousUser' object has no attribute 'first_name'

有没有办法解决这个问题?

【问题讨论】:

    标签: django django-rest-framework token


    【解决方案1】:

    身份验证请求的标头中不包含身份验证令牌,这就是 request.user 返回 AnonymousUser 对象的原因。 要修复此错误,您需要将 request.user 替换为 serializer.user,如下所示:

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

    【讨论】:

      猜你喜欢
      • 2023-03-16
      • 1970-01-01
      • 2014-04-14
      • 1970-01-01
      • 2021-07-01
      • 1970-01-01
      • 2018-12-15
      • 1970-01-01
      • 2019-02-20
      相关资源
      最近更新 更多