Django REST,ajax调用突然403错误

时间:2016-02-22 15:10:44

标签: ajax django django-rest-framework

我有一个基本的观点

@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错误。我只有在使用' normal'火狐。

2 个答案:

答案 0 :(得分:1)

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

在下次尝试时,您可能会再次遇到此问题,因此您会跟踪某些用户未获得权限的原因。

答案 1 :(得分:1)

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

我刚刚为ajax调用添加了csrf protecion。 (来自django docs)

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保护引起的?