无法将请求转换为电话号码。 django rest自定义令牌认证

时间:2019-09-17 16:59:34

标签: python django authentication django-rest-framework auth-token

我正在尝试创建自定义令牌身份验证端点,该端点在请求POST中接受电话号码,令牌和状态,然后按如下所示响应

  1. 成功的响应应创建一个链接到用户对象的状态对象

  2. 失败请求可以是未授权请求,也可以是基于身份验证令牌/电话的错误请求 数字组合。

为此,我编写了以下代码片段:

serializers.py

class TokenSerializer(serializers.Serializer):
    phone_number = serializers.CharField(required=True, allow_blank=False)

    def validate(self, attrs):
        phone_number = attrs.get('phone_number')

        user = authenticate(request=self.context.get('request'),phone_number=phone_number)
        if user is None:
            msg = ('Unable to log in with provided credentials.')
            raise serializers.ValidationError(msg, code='authorization')
        else:
            msg = ('Must include "phone_number.')
            raise serializers.ValidationError(msg, code='authorization')

        attrs['user'] = user
        return attrs

views.py

class TokenView(APIView):
    serializer_class=TokenSerializer
    authentication_classes = (CustomTokenAuthentication, )
    def post(self, request, *args, **kwargs):
        serializer = self.serializer_class(data=request.data,
                                           context={'request': request})
        serializer.is_valid(raise_exception=True)

        new_data = serializer.data
        user = serializer.validated_data
        login(request,user)
        token, created = Token.objects.get_or_create(user=user)
        return Response({
            'user':new_data,
            'token':token.key
            })

authbackend.py:

class CustomTokenAuthentication(TokenAuthentication):
    def authenticate_credentials(self, key,phone_number):
        try:
            user = UserProfile.objects.get(phone_number=username)
            return user
        except ObjectDoesNotExist:
            # Run the default password hasher once to reduce the timing
            # difference between an existing and a non-existing user (#20760).
            raise exceptions.AuthenticationFailed('Invalid phone ')
        try:
            token = self.model.objects.get(key=key)
        except self.model.DoesNotExist:
            raise exceptions.AuthenticationFailed('Invalid token')


        return (token.user, token)

尝试登录时出现此错误:

/ token /

处的

TypeError

无法将请求转换为电话号码。

请求方法:POST 要求网址:http://127.0.0.1:8000/token/ Django版本:2.1.5 异常类型:TypeError 异常值:
无法将请求转换为电话号码。 异常位置:to_python,第107行中的/usr/local/lib/python3.6/dist-packages/phonenumber_field/phonenumber.py Python可执行文件:/ usr / bin / python 的Python版本:3.6.7 Python路径:
['/ home / zynaboo / Desktop / dev / Customers',  '/usr/lib/python36.zip',  '/usr/lib/python3.6',  '/usr/lib/python3.6/lib-dynload',  '/home/zynaboo/.local/lib/python3.6/site-packages',  '/usr/local/lib/python3.6/dist-packages',  '/ usr / lib / python3 / dist-packages'] 服务器时间:周二,2019年9月17日16:48:01 +0000

请帮忙吗?预先感谢

0 个答案:

没有答案