django - DRF中的登录视图

时间:2015-05-26 11:27:36

标签: python django login django-rest-framework

我的django代码中有一个注册视图,工作正常:

在Django休息框架中工作,

class UserViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

    @list_route(methods=['post'])
    def register(self, request):
        serializer = UserSerializer(data=request.DATA)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

现在我想添加登录视图以便让用户登录,我写了这样的内容,对此不确定:

@list_route(methods=['post'])
    def login(self, request):
        username = request.POST['username']
        password = request.POST['password']

        user = authenticate(username=username, password=password)
        if user is not None:
            if user.is_active:
                login(request, user)
                return Response(status=status.HTTP_200_OK)
            else:
                return Response(status=status.HTTP_404_NOT_FOUND)
        else:
            return Response(status=status.HTTP_401_UNAUTHORIZED)

几个问题:

  • 看起来不错吗?
  • 而且,我应该如何POST到此视图?到寄存器视图我用json POST,它工作正常。 用户名和密码的json也可以在这里工作吗?

2 个答案:

答案 0 :(得分:1)

使用DRF登录方法不正确。 登录时你没有使用过串口。 您可以通过这些api进行登录,注销等以获得清晰的理解

Djoser Djoser库提供了一组视图来处理基本操作,例如注册,登录,注销,密码重置和帐户激活。该程序包使用自定义用户模型,并使用基于令牌的身份验证。这是Django身份验证系统的随时可用的REST实现。

django-rest-auth Django-rest-auth库提供了一组REST API端点,用于注册,身份验证(包括社交媒体身份验证),密码重置,检索和更新用户详细信息等。通过使用这些API端点,您的客户端应用程序,如AngularJS,iOS, Android和其他人可以通过REST API独立地与您的Django后端站点进行通信以进行用户管理。

答案 1 :(得分:0)

你的*寄存器正在使用@list_route模式监听post方法,你还希望用* list_route绑定你的* login再次发帖?!?

这是不可能的,如果你问我我更喜欢用APIView类型实现我的认证类

创建您的登录(views.APIView),如下所示:

class LoginView(views.APIView):
    def post(self, request, format=None):
        data = request.data

        username = data.get('username', None)
        password = data.get('password', None)

        user = authenticate(username=username, password=password)

        if user is not None:
            if user.is_active:
                login(request, user)

                return Response(status=status.HTTP_200_OK)
            else:
                return Response(status=status.HTTP_404_NOT_FOUND)
        else:
            return Response(status=status.HTTP_404_NOT_FOUND)