一尘不染

在Django中通过AJAX发布参数时,“ CSRF令牌丢失或不正确”

django

我尝试发布参数像

 jQuery.ajax(
        {
            'type': 'POST',
            'url': url,
            'contentType': 'application/json',
            'data': "{content:'xxx'}",
            'dataType': 'json',
            'success': rateReviewResult 
        }
    );

但是,Forbidden 403. CSRF verification failed. Request aborted. 我正在使用Django返回'django.middleware.csrf.CsrfViewMiddleware',找不到在不影响安全性的情况下如何防止此问题。


阅读 383

收藏
2020-03-26

共1个答案

一尘不染

你可以通过两种不同的方式发出AJAX发布请求:

告诉你的视图不要检查csrf令牌。这可以通过使用decorator来完成@csrf_exempt,如下所示:

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def your_view_name(request):
    ...

要将csrf令牌嵌入每个AJAX请求中,对于jQuery,它可能是:

$(function () {
    $.ajaxSetup({
        headers: { "X-CSRFToken": getCookie("csrftoken") }
    });
});

该getCookie函数从cookie检索csrf令牌的位置。我使用以下实现:

function getCookie(c_name)
{
    if (document.cookie.length > 0)
    {
        c_start = document.cookie.indexOf(c_name + "=");
        if (c_start != -1)
        {
            c_start = c_start + c_name.length + 1;
            c_end = document.cookie.indexOf(";", c_start);
            if (c_end == -1) c_end = document.cookie.length;
            return unescape(document.cookie.substring(c_start,c_end));
        }
    }
    return "";
 }

另外,jQuery 有一个用于访问cookie 的插件,类似这样:

// set cookie
$.cookie('cookiename', 'cookievalue');
// read cookie
var myCookie = $.cookie('cookiename');
// delete cookie
$.cookie('cookiename', null);
2020-03-26