Django REST,ajax调用中突然出现403错误

Posted

技术标签:

【中文标题】Django REST,ajax调用中突然出现403错误【英文标题】:Django REST, sudden 403 error in ajax call 【发布时间】:2016-06-04 02:02:15 【问题描述】:

我有一个基本的看法

@api_view(['POST'])
def test(request):
    id = request.POST.get("id")    
    response = 
    try:
        obj = MyModel.objects.get(id=id)
        response['can'] = False
    except MyModel.DoesNotExist:
        response['can'] = True
    return Response(response)

在网址中

url(r'^test', test),

模板中的简单调用:

$.ajax(
        type : "POST",
        data : id:id,
        url  : "/test/",
        success: function(data) 
            if(data['can'])
                $("#Test").show();
             else
                $("#Test").hide();
            
        ,
        error: function(error) 
            console.log(error);
        
    );

而且它最近有效。但是今天,当我测试这个应用程序时,我得到了错误:

[22/Feb/2016 15:09:02] "POST /test/ HTTP/1.1" 403 58

意思是“禁止访问”。我不知道是怎么回事。也许你可以帮忙。

编辑 我刚刚注意到它发生在Firefox浏览器上。在 ubuntu 的“浏览器”和谷歌浏览器上,我没有这个 403 错误。

编辑 2 哦,当我将 firefox 作为私有/隐身窗口运行时,我没有这个 403 错误。仅当我使用“普通”Firefox 时才会出现此错误。

【问题讨论】:

【参考方案1】:

可能的问题:可能是之前的用户会话仍在浏览器 cookie 中。尝试清除 Firefox 浏览器的 cookie。

下次尝试时,您可能会再次遇到该问题,因此您可以追溯为什么某些用户没有被授予权限。

【讨论】:

【参考方案2】:

没有用户或任何权限。这是“未登录”用户的应用程序。

我刚刚为 ajax 调用添加了 csrf 保护。 (来自 django 文档)

function getCookie(name) 
var cookieValue = null;
if (document.cookie && document.cookie != '') 
    var cookies = document.cookie.split(';');
    for (var i = 0; i < cookies.length; i++) 
        var cookie = jQuery.trim(cookies[i]);
        if (cookie.substring(0, name.length + 1) == (name + '=')) 
            cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
            break;
        
    

return cookieValue;

var csrftoken = getCookie('csrftoken');
function csrfSafeMethod(method) 
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));

$.ajaxSetup(
    beforeSend: function(xhr, settings) 
        if (!csrfSafeMethod(settings.type) && !this.crossDomain) 
            xhr.setRequestHeader("X-CSRFToken", csrftoken);
        
    
);

而且它的工作。我觉得对吗?这个错误是由于缺少csrf保护造成的吗?

【讨论】:

以上是关于Django REST,ajax调用中突然出现403错误的主要内容,如果未能解决你的问题,请参考以下文章

Ajax 发布 Django Rest Framework 出现 403 禁止错误

POST 请求创建多个对象 AJAX/Django Rest Framework

每当我通过 ajax 调用它时,Django Rest 框架会用 AnonymousUser 替换我当前经过身份验证的用户吗?

是否可以在 Django Rest Framework 中的 ajax 请求期间追溯 403 错误?

JavaScript AJAX 调用中的安全 REST API 令牌

ajax 调用 jersey rest web 服务中的 Access-Control-Allow-Origin