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错误的主要内容,如果未能解决你的问题,请参考以下文章