angularjs – Django Rest Framework – 为什么在尝试使用不正确
这是我的URLs.py:
url(r'^api-auth/',include('rest_framework.urls',namespace='rest_framework')), 我的主页上有一个表单,用户可以在其中键入用户名和密码.单击提交按钮时,AngularJS会使用用户对象(用户名和密码)向“api-auth / login /”发送POST请求: $http.post("/api-auth/login/",self.loginuser) .error(function(data,status,headers,config) { console.log(data); }); 当用户提交错误的用户名和密码(用户名和密码不存在或不匹配)时,Django Rest Framework返回200 OK而不是204 No Content,404或401 Unauthorized(在这篇文章中,它表示401是要返回的正确状态代码:What’s the appropriate HTTP status code to return if a user tries logging in with an incorrect username / password,but correct format?). 根据这里:http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html在第9.5节POST中,它说“在这种情况下,200(OK)或204(No Content)是适当的响应状态,具体取决于响应是否包括描述结果的实体.” 如果数据存在,我处理错误并记录数据(我在JS中执行了console.log(data)),但是没有记录数据,这意味着(根据我的理解)没有数据被发送/响应不包括描述的实体结果. 那么为什么DjangoRestFramework会返回200而不是204 No Content(或者404或401,根据我链接的其他SO帖子应该返回什么)? 解决方法
你的问题中有几件事情混杂在一起.首先,您使用的技术观点,以及您解释答案的方式.
1)意见 这是一个快速的.通过将数据发送到/ api-auth / login / it DRF的可浏览API的登录视图来使用的视图.这个视图实际上是Django的auth应用程序(django.contrib.auth.views.login)附带的视图,它假定它正在处理用户,手动浏览API. 也就是说:使用GET调用它构建一个空的html表单,使用POST发回表单将触发表单验证,这可能会以重新显示的形式结束(200 Ok,包含文档),或者重定向要发回(302找到空的内容). 这就是你的数据为空的原因:服务器发送一个HTML文档,而你的angular可能试图解析一些JSON对象. 您使用的表单视图绝对不能从脚本中调用.这可以完成,但您需要相应地处理结果,这意味着分析返回的html页面以查找错误消息.乱. 如果要轻松地从脚本访问它,则应构建自己的登录视图. 2)文件与要求 您在这里处理两个不同级别的语义. >请求的含义. HTTP错误代码在请求的上下文中是有意义的.它们发生在较低的水平.例如,返回401代码意味着“在执行此请求之前需要有效的身份验证凭据”. 所以在这里,这基本上意味着“在处理您的登录请求之前,您必须拥有有效的身份验证凭据”. 它可能有意义,但仅限于您有两层身份验证的环境中.在第二层登录请求通过之前,您需要具有对第一层有效的身份验证凭据.在这种情况下,如果您尝试使用第二层登录而未被第一层识别,则可以获得401. 那么,REST如何适应? 当应用于HTTP时,REST的概念是尝试匹配请求级语义和文档级语义.它特别适合,因为每个REST概念都有匹配的HTTP动词,HTTP是可缓存的,客户端 – 服务器,……和……无状态. 无状态意味着HTTP和REST都没有登录的概念.登录是一种抽象,这通常意味着我们使用如下所示的工作流: >我们对某些端点进行身份验证(登录/密码,质询,oauth等). 但事实是,每个请求都必须由服务器授权.也就是说,服务器将始终通过授权请求开始,然后再查看内部的内容.如果此步骤失败,则401是足够的响应. 除了步骤#1.此请求没有授权步骤.必须对其进行处理,必须检索并检查登录/密码,并且根据结果,服务器可能决定发回授权令牌. 那么,如果选择不这样做,哪些错误代码是合适的?嗯,有几个你可以选择: > 200好的.登录请求已成功处理并产生错误消息,这是一个包含结果的文档.然后,您的脚本将读取文档(例如,可能是JSON对象)以查看它是否有错误或授权令牌. 唯一可以肯定的是,401不是一个选择. 401意味着你不允许尝试登录.不是登录失败. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |