这篇文章主要围绕使用错误凭据的Django登录返回200而不是401和错误使用regress(line62)展开,旨在为您提供一份详细的参考资料。我们将全面介绍使用错误凭据的Django登录返回200
这篇文章主要围绕使用错误凭据的Django登录返回200而不是401和错误使用regress(line62)展开,旨在为您提供一份详细的参考资料。我们将全面介绍使用错误凭据的Django登录返回200而不是401的优缺点,解答错误使用regress(line62)的相关问题,同时也会为您带来Ajax请求返回200 OK,但是会引发错误事件而不是成功、AJAX请求返回200确定,但错误事件被触发,而不是成功、Ajax,Django:状态为200,但抛出错误而不是成功、angularjs – Django Rest Framework – 为什么在尝试使用不正确的凭据登录用户时会返回200状态代码?的实用方法。
本文目录一览:- 使用错误凭据的Django登录返回200而不是401(错误使用regress(line62))
- Ajax请求返回200 OK,但是会引发错误事件而不是成功
- AJAX请求返回200确定,但错误事件被触发,而不是成功
- Ajax,Django:状态为200,但抛出错误而不是成功
- angularjs – Django Rest Framework – 为什么在尝试使用不正确的凭据登录用户时会返回200状态代码?
使用错误凭据的Django登录返回200而不是401(错误使用regress(line62))
这是一个非常简单的测试,但我似乎无法正确完成。
我想检查哪些用户可以登录并执行操作(这是一整套测试的一部分),但是第一步会引起一些问题。
class SuperUserTest(TestCase): def setUp(self): self.client = Client() self.su = User.objects.create_superuser(''super'','''',''the_correct_password'') def test_su_can_login(self): response = self.client.post(reverse(''django.contrib.auth.views.login''), {''username'': ''super'', ''password'': ''the_wrong_password''}) self.assertEqual(response.status_code,401) # Success redirects to the homepage, so its 302 not 200 response = self.client.post(reverse(''django.contrib.auth.views.login''), {''username'': ''super'', ''password'': ''the_correct_password''}) self.assertEqual(response.status_code,302)
当我运行测试时,我得到:
(my_app)00:20 ~/my_app (master)$ ./manage.py test my_app.SuperUserTestCreating test database for alias ''default''...F======================================================================FAIL: test_su_can_login (my_app.SuperUserTest)----------------------------------------------------------------------Traceback (most recent call last): File "./my_app/tests.py", line 341, in test_su_can_login self.assertEqual(response.status_code,401)AssertionError: 200 != 401----------------------------------------------------------------------Ran 1 test in 1.180sFAILED (failures=1)Destroying test database for alias ''default''...
为什么200
我不正确登录时django返回HTTP代码?
对于其他上下文,这是我如何管理登录/注销URL:
urlpatterns = patterns('''', # Examples: url(r''^accounts/login/?$'', ''django.contrib.auth.views.login''), url(r''^accounts/logout/?$'', ''django.contrib.auth.views.logout'', {''next_page'': ''/''}),
答案1
小编典典Web社区中有一些关于对凭证失败的正确响应的辩论。例如,这是有关从切换到的Wordpress凭单。在Stack
Overflow上,您可以找到一些建议和一些建议。200``401``401
Django选择返回一个200
响应以及重新渲染的表单。
我认为这是正确的方法。一个401
或403
响应表明用户无权访问该资源(URL)。但是在这种情况下,资源是登录点,并且您 不需要
凭据即可访问该资源。根据定义,它对所有用户可用。因此,从本质上讲,这种情况与任何其他表单验证没有区别-
服务器正在检查发送的输入,如果输入无效,它将返回200
响应以及表单和错误消息。
Ajax请求返回200 OK,但是会引发错误事件而不是成功
我已经在我的网站上实现了Ajax请求,并且正在从网页调用端点。它总是返回 200 OK ,但是 jQuery 执行error事件。
我尝试了很多事情,但无法弄清问题所在。我在下面添加我的代码:
jQuery代码
var row = "1";var json = "{''TwitterId'':''" + row + "''}";$.ajax({ type: ''POST'', url: ''Jqueryoperation.aspx?Operation=DeleteRow'', contentType: ''application/json; charset=utf-8'', data: json, dataType: ''json'', cache: false, success: AjaxSucceeded, error: AjaxFailed});function AjaxSucceeded(result) { alert("hello"); alert(result.d);}function AjaxFailed(result) { alert("hello1"); alert(result.status + '' '' + result.statusText);}
的C#代码 JqueryOpeartion.aspx
protected void Page_Load(object sender, EventArgs e) { test();}private void test() { Response.Write("<script language=''javascript''>alert(''Record Deleted'');</script>");}
("Recorddeleted")
成功删除后,我需要该字符串。我可以删除内容,但是没有收到此消息。这是正确的还是我做错了什么?解决此问题的正确方法是什么?
答案1
小编典典jQuery.ajax
尝试根据指定的dataType
参数或Content-Type
服务器发送的标头转换响应主体。如果转换失败(例如,如果JSON / XML无效),则会触发错误回调。
您的AJAX代码包含:
dataType: "json"
在这种情况下,jQuery:
将响应评估为JSON并返回一个JavaScript对象。[…]严格解析JSON数据;任何格式错误的JSON都会被拒绝,并引发解析错误。[…]空响应也被拒绝;服务器应返回null或{}的响应。
您的服务器端代码返回带有200 OK
状态的HTML代码段。jQuery期望使用有效的JSON,因此会引发抱怨的错误回调parseerror
。
解决方案是dataType
从jQuery代码中删除参数,并使服务器端代码返回:
Content-Type: application/javascriptalert("Record Deleted");
但我宁愿建议返回JSON响应并在成功回调中显示消息:
Content-Type: application/json{"message": "Record deleted"}
AJAX请求返回200确定,但错误事件被触发,而不是成功
jQuery代码
var row = "1"; var json = "{'TwitterId':'" + row + "'}"; $.ajax({ type: 'POST',url: 'Jqueryoperation.aspx?Operation=DeleteRow',contentType: 'application/json; charset=utf-8',data: json,dataType: 'json',cache: false,success: AjaxSucceeded,error: AjaxFailed }); function AjaxSucceeded(result) { alert("hello"); alert(result.d); } function AjaxFailed(result) { alert("hello1"); alert(result.status + ' ' + result.statusText); }
C#代码为JqueryOpeartion.aspx
protected void Page_Load(object sender,EventArgs e) { test(); } private void test() { Response.Write("<script language='javascript'>alert('Record Deleted');</script>"); }
我需要成功删除后(“记录已删除”)字符串。我可以删除内容,但我没有收到此消息。这是正确的,或者我做错了什么。请建议正确的方法来解决这个问题。
dataType: "json"
documentation说jQuery:
Evaluates the response as JSON and returns a JavaScript object. (…)
The JSON data is parsed in a strict manner; any malformed JSON is
rejected and a parse error is thrown.
这意味着如果服务器返回200 OK状态的无效JSON,则jQuery触发错误函数,并将textStatus参数设置为“parsererror”。
解决方案:确保服务器返回有效的JSON。值得注意的是,空响应也被认为是无效的JSON;您可以返回{}或null,例如验证为JSON。
你可以在jsonlint.com检查json是否有效
Ajax,Django:状态为200,但抛出错误而不是成功
使用$('.commentForm')
发送表单数据到后端时,它将获取类commentForm
的所有表单,并发送所有形式的数据,这是其无法正常工作的原因。相反,您可以更改此{ {1}}至$('.commentForm').serialize()
。
此外,您正在ajax的成功函数中使用 $(this).closest(".commentForm").serialize()
,这将覆盖#${id}.comments
中的任何内容并从url即#${id}.comments
加载新内容。因此,请避免这种方式将在您的/posts/comments/..
周围加上一些外部div,然后更改选择器,即:{% include 'posts/comments.html' %}
,这样,新内容将仅在#${id}.comments > .yourouterdivclassname
内加载,从而不会删除表格。
您应使用button type='submit'
提交表单。 button type='button'
不执行任何操作。我建议你这样做。 (您说过“提交”按钮有效,但是您没有说为什么不使用它,所以我假设这是因为它重新加载了页面。)
编辑:button type='button'
为什么不起作用?并非如此。这只是一种更好的方法。我相信,您真正的问题是为什么它不起作用。这种方法应该可以,但是我对$.ajax
并不熟悉。
模板
<divid="{{ post.pk }}">
{% include 'posts/comments.html' %}
<form action="" method="post"data-url="{% url 'post_comments' post.pk %}">
{% csrf_token %}
<input type="hidden" name="pk" value="{{ post.pk }}">
{{ form.as_p }}
<button type="submit"id="{{ post.pk }}">Comment</button>
</form>
</div>
JavaScript
$(document).ready(function () {
$('.commentForm').on('submit',function (e) {
e.preventDefault(); // Doesn't reload page
let $this = $(this);
let serializedData = $this.serialize();
let btn = $('.commentBtn');
let id = btn.attr('id');
console.log($this.data('url'));
$.ajax({
url: $this.data('url'),data: serializedData,type: 'post',dataType: 'json',success: function (data) {
console.log(data);
$(`#${id}.comments`).load('/posts/comments/' + data.post);
$('textarea').val('');
},error: function(textStatus) {
console.log(textStatus)
}
})
})
})
更新:您的500错误表明您正在尝试将字典存储为另一个字典的键,这是不允许的。将您的return
语句更改为return JsonResponse({'comment': model_to_dict(new_comment)},status=200)
,它应该可以工作。
更新2:403错误代码表示禁止。 Django是
angularjs – Django Rest Framework – 为什么在尝试使用不正确的凭据登录用户时会返回200状态代码?
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对象)以查看它是否有错误或授权令牌.
> 204没有内容.登录请求已成功处理,但没有产生任何内容,当然也没有授权令牌.奇怪的选择,但正确.
> 400不良请求.登录请求未成功处理.
唯一可以肯定的是,401不是一个选择. 401意味着你不允许尝试登录.不是登录失败.
今天关于使用错误凭据的Django登录返回200而不是401和错误使用regress(line62)的讲解已经结束,谢谢您的阅读,如果想了解更多关于Ajax请求返回200 OK,但是会引发错误事件而不是成功、AJAX请求返回200确定,但错误事件被触发,而不是成功、Ajax,Django:状态为200,但抛出错误而不是成功、angularjs – Django Rest Framework – 为什么在尝试使用不正确的凭据登录用户时会返回200状态代码?的相关知识,请在本站搜索。
本文标签: