ajax中的django csrf不起作用

ajax中的django csrf不起作用,ajax,django,csrf,Ajax,Django,Csrf,我有一个表单,并使用json数据将其发布到服务器,服务器将其保存在数据库中。这是我的密码 function saveChanges() { var items = []; $('ol.item_list > li.item').each(function(){ items.push(getItemData($(this))); }); var csrftoken = $.cookie('csrftoken'); $.ajax({

我有一个表单,并使用json数据将其发布到服务器,服务器将其保存在数据库中。这是我的密码

function saveChanges() {
    var items = [];
    $('ol.item_list > li.item').each(function(){
        items.push(getItemData($(this)));
    });

    var csrftoken = $.cookie('csrftoken');
    $.ajax({
        url : '',
        type: 'POST',
        headers : {"X-CSRFToken": csrftoken},
        data : $.toJSON(items),
        success: function(data, textStatus, jqXHR){
            console.log(data);
        },
        error: function(jqXHR, textStatus, errorThrown){
            alert(textStatus);
        },
    });

}

问题是,我调用saveChanges(通过一个按钮)两次,都返回200httpok。所以我在数据库中得到了重复的数据。csrf令牌是否应该复制sumbit?如何修复它?

不,CSRF令牌不会阻止任何类型的重复提交。其目的是预防,而不是其他。它创建了一个令牌,这样就没有人可以欺骗你提交你不打算做的请求

如果要防止重复提交,一种方法是在单击一次提交按钮后禁用该按钮。然而,这绝不是一个好的解决方案,因为JavaScript在客户端运行,并且可以很容易地进行操作(例如通过Firebug)。所以重复提交仍然是可能的,只是不是那么明显

更好的方法是在服务器端Python代码中进行验证。您可以检查提交的数据是否已经存在于数据库中,如果已经存在,则忽略该请求或选择性地返回错误消息。这确保了即使在JavaScript上乱动,恶意用户也无法保存数据两次


我会使用这两种方法,第一种方法只是告诉用户,他不应该尝试两次提交相同的数据-这只是一种界面特惠。

您应该通过适当的操作来防止重复提交 规划脚本执行流程和脚本结构,以防止出现这种情况