获得403

时间:2015-12-04 21:29:34

标签: django django-rest-framework

我正在学习使用Django Rest Framework并遵循本教程。我已经根据教程创建了一个简单的索引,它适用于GET,但不适用于POST:

@api_view(['GET','POST'])
def game_list(request):
    if request.method == 'GET':
        games = Game.objects.all()
        serializer = GameSerializer(games, many=True)
        return Response(serializer.data)
    elif request.method == 'POST':
        serializer = GameSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

我将默认设置设为AllowAny

REST_FRAMEWORK = {
    # Use Django's standard `django.contrib.auth` permissions,
    # or allow read-only access for unauthenticated users.
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.AllowAny'
    ]
}

但是当我尝试POST使用Firefox RESTClient时,我仍然会收到HTTP 403。 I read我必须添加X-CSRFToken标题和Cookie才能生效,但我没有。

1 个答案:

答案 0 :(得分:0)

来自文档:

  

默认情况下,如果传入请求未通过CsrfViewMiddleware执行的检查,则会向用户发送“403 Forbidden”响应。这通常只有在存在真正的跨站点请求伪造时才会出现,或者由于编程错误而导致POSTF表单中未包含CSRF令牌时。

此外,正如官方文档所述,默认情况下启用了CSRF,并且您需要在AJAX请求中添加X-CSRFToken。

以下是文档中的代码:

// using jQuery
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]);
            // Does this cookie string begin with the name we want?
            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) {
    // these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}

请记住,文档建议使用jquery中的ajaxSetup方法,这不是推荐的方法,因为它可以改变其他脚本使用ajax函数的方式,因此最好添加特定的CSRF代码。您的自定义JS代码如下:

$.ajax({
    method: 'POST',
    url: 'your.url.com/',
    beforeSend: function(xhr, settings) {
        if (!WU._csrfSafeMethod(settings.type) && !this.crossDomain) {
            xhr.setRequestHeader("X-CSRFToken", csrftoken);
        }
    },
    success: function(msg)
    {}
});

参考:https://docs.djangoproject.com/en/1.9/ref/csrf/#ajax

相关问题