用户注册和登录Django

时间:2018-03-16 18:35:48

标签: python django python-3.x django-rest-framework

我修改了默认用户并使用此方法注册新用户。

class RegisterView(views.APIView):
    def post(self, request, **kwargs):
        location = Location.objects.get(id=kwargs.get('location_id'))
        serializer = UserSerializer(data=request.data)
        if serializer.is_valid():
            user = serializer.save()
            user.location = location
            user.save()
            subject = "Please Activate Your FootTheBall Account!"
            token = self._generate()
            link = HOST + PREFIX + str(user.id) + SUFFIX + token
            message = 'Please use the following link to activate your account.\n\n{}'.format(link)
            from_email = settings.EMAIL_HOST_USER
            to_list = [user.email, 'soumasish@foottheball.com']
            send_mail(subject, message, from_email, to_list, fail_silently=True)

            Token.objects.create(user=user, token=token)
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

这很好用,用户在数据库中注册。我已经证实了这一点。

现在我调用此方法登录用户。

class LoginView(views.APIView):
    def post(self, request):
        user = authenticate(
            email=request.data.get("email"),
            password=request.data.get("password")
        )
        if not user:
            return Response({
                'status': 'Unauthorized',
                'message': 'Email or password incorrect',
            }, status=status.HTTP_401_UNAUTHORIZED)
        login(request, user)
        return Response(UserSerializer(user).data)

尽管提供了正确的电子邮件和密码,但无法找到用户并且验证方法失败。 我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

如果您使用的是Django auth的默认用户模型,则用户应使用usernamepassword登录,而不是emailpassword

您的序列化程序(我假设是基于用户模型的ModelSerializer)保存,因此username字段正在发送,但您没有使用它进行身份验证。

您可以通过电子邮件方式登录:

  1. 创建自定义用户模型,这有点麻烦。
  2. 编写身份验证后端,如果您关注the docs,这非常简单。
  3. 编辑:当您说自定义用户模型时,我刚读了第一行。如果是这样,请确保您将班级的USERNAME_FIELD属性定义为email