GVKun编程网logo

使用错误凭据的Django登录返回200而不是401(错误使用regress(line62))

11

这篇文章主要围绕使用错误凭据的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))

使用错误凭据的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响应以及重新渲染的表单。

我认为这是正确的方法。一个401403响应表明用户无权访问该资源(URL)。但是在这种情况下,资源是登录点,并且您 不需要
凭据即可访问该资源。根据定义,它对所有用户可用。因此,从本质上讲,这种情况与任何其他表单验证没有区别-
服务器正在检查发送的输入,如果输入无效,它将返回200响应以及表单和错误消息。

Ajax请求返回200 OK,但是会引发错误事件而不是成功

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确定,但错误事件被触发,而不是成功

AJAX请求返回200确定,但错误事件被触发,而不是成功

我在我的网站上实现了一个AJAX请求,我从一个网页调用。它总是返回200 OK,但jQuery执行错误事件。我试过很多事情,但不能找出这个问题。我在下面添加我的代码:

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>");
}

我需要成功删除后(“记录已删除”)字符串。我可以删除内容,但我没有收到此消息。这是正确的,或者我做错了什么。请建议正确的方法来解决这个问题。

您的AJAX请求包含以下设置:
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,但抛出错误而不是成功

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状态代码?

angularjs – Django Rest Framework – 为什么在尝试使用不正确的凭据登录用户时会返回200状态代码?

这是我的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对象)以查看它是否有错误或授权令牌.
> 204没有内容.登录请求已成功处理,但没有产生任何内容,当然也没有授权令牌.奇怪的选择,但正确.
> 400不良请求.登录请求未成功处理.

唯一可以肯定的是,401不是一个选择. 401意味着你不允许尝试登录.不是登录失败.

今天关于使用错误凭据的Django登录返回200而不是401错误使用regress(line62)的讲解已经结束,谢谢您的阅读,如果想了解更多关于Ajax请求返回200 OK,但是会引发错误事件而不是成功、AJAX请求返回200确定,但错误事件被触发,而不是成功、Ajax,Django:状态为200,但抛出错误而不是成功、angularjs – Django Rest Framework – 为什么在尝试使用不正确的凭据登录用户时会返回200状态代码?的相关知识,请在本站搜索。

本文标签: