Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django-DRF中的登录视图_Python_Django_Login_Django Rest Framework - Fatal编程技术网

Python django-DRF中的登录视图

Python django-DRF中的登录视图,python,django,login,django-rest-framework,Python,Django,Login,Django Rest Framework,我的django代码中有一个register视图,它运行良好: 在Django rest框架中工作 class UserViewSet(viewsets.ReadOnlyModelViewSet): queryset = User.objects.all() serializer_class = UserSerializer @list_route(methods=['post']) def register(self, request): se

我的django代码中有一个register视图,它运行良好:

在Django rest框架中工作

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)
两个问题:

  • 看起来还好吗
  • 还有,我应该如何发布到这个视图?我用json发布到register视图,效果很好。 带有用户名和密码的json在这里也可以工作吗

您使用DRF的登录方法不正确。 对于登录,您尚未使用序列化程序。 您可以通过这些api进行登录、注销等,以便清楚地理解

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


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

您的*注册器正在使用@list\u路由模式侦听post方法,您还想将*登录绑定到@list\u路由以再次发布

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

按如下方式创建您的登录名(views.APIView):



看起来很奇怪。REST的理念就是让服务器处于无状态。“通过REST登录”的概念听起来是错误的。通常,REST端点应该是对象,即名词,而不是动词。除此之外,它没有理由不起作用。很遗憾,谢谢你的回答。问题是,我真的无法理解实际登录发生在哪里。在“经典的REST服务器场景”(我的意思是它应该是这样的)中,登录是如何发生的??我已经在安卓应用程序上注册了。现在,用户想要登录以发出一些请求,实际登录在哪里?您会在每个请求上发送凭据。登录过程通常创建并返回一些令牌,您可以在后续请求中使用这些令牌,而不是发送user/pass。Django的auth模块使用会话来实现这一点——授予访问权限的数据段是会话id,它作为cookie返回到浏览器。根据您的设置,您可以使用它,或者您需要实现一些类似的功能(这是chandu建议的LIB所做的)。@spectras情况并非总是如此。是的,RESTAPI应该是无状态的,但在单页应用程序的上下文中,需要有某种方法来创建会话,以便用户登录以执行受限操作。我在互联网上搜索过,想知道单页应用程序的最佳登录实现是什么,最终我又回到了sessions@OzzyTheGiant会话基本上是在每个请求上发送某种形式的凭据的一种方式。这正是我在上面的评论中描述的:)什么是login()?@nassim login来自django.contrib.auth import login如果设置了令牌身份验证,该代码如何返回auth令牌?因此,如果您在响应中收到令牌,则可以授权所有后续请求。请注意,
django rest auth
不再维护。但它的fork
dj rest auth
自2021年6月起一直在维护。
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)