Python django-DRF中的登录视图
我的django代码中有一个register视图,它运行良好: 在Django rest框架中工作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
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在这里也可以工作吗
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
不再维护。但它的forkdj 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)