如何将csrf_令牌传递给jqgrid的editurl的post参数?

2024-06-16 12:16:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Django框架中使用JqGrid。这是JS:

      jQuery("#list").jqGrid({
        url:'{% url views.manage.devicesajax %}',
        datatype: 'json',
        mtype: 'GET',
        colNames:['DID', 'UDID', 'Owner', 'Name', 'First seen', 'Last seen'],
        colModel :[ 
          {name:'did', index:'did', width: 30, searchoptions:{sopt:['eq','ne','bw','cn']}}, 
          {name:'udid', index:'udid', width: 120, editable: true, searchoptions:{sopt:['eq','ne','bw','cn']}}, 
          {name:'d_owner', index:'d_owner', width: 70, editable: true, searchoptions:{sopt:['eq','ne','bw','cn']}}, 
          {name:'d_name', index:'d_name', editable: true, searchoptions:{sopt:['eq','ne','bw','cn']}}, 
          {name:'d_firstseen', index:'d_firstseen', width: 80}, 
          {name:'d_lastseen', index:'d_lastseen', width: 80}],
        pager: jQuery('#pager'),
        rowNum:20,
        rowList:[20,50,100],
        sortname: 'did',
        sortorder: "desc",
        multiselect: true,
        viewrecords: true,
        imgpath: 'themes/basic/images',
        caption: 'Devices list',
        height: 330,
        width: 1000,
        onSelectRow: function(id) {
            var id = $("#list").getRowData(id).message_id;
            message_id = id;
        },
        editurl: "{% url views.manage.deviceseditajax %}"
    });

当我在JqGrid中编辑行时,我从editurl得到错误:

Forbidden (403) CSRF verification failed. Request aborted.

这是因为csrf_令牌不会与其他数据一起传递给editurl。 如何将csrf_令牌添加到editurl的POST请求中?在

这段代码运行得很好(完整的jqgrid init):

^{pr2}$

Tags: nameidtrueurlindexcnwidthlist
3条回答

我不使用Django框架,也不熟悉csrf_token,但是在Google中搜索之后,您似乎需要在请求的HTTP报头中设置它:xhr.setRequestHeader('X-CSRF-Token', csrf_token);。要在jqGrid中执行此操作,可以使用loadBeforeSend事件处理程序:

loadBeforeSend: function(jqXHR) {
    // you should modify the next line to get the CSRF tocken
    // in any way (for example $('meta[name=csrf]').attr('content')
    // if you have <meta name="csrf" content="abcdefjklmnopqrstuvwxyz="/>)
    var csrf_token = '<%= token_value %>'; // any way to get
    jqXHR.setRequestHeader('X-CSRF-Token', csrf_token);
}

请参阅here以了解一个非常接近的问题。在

已更新:若要在使用表单编辑时发布其他数据,可以使用editData:editData:{csrfmiddlewaretoken:'<;%=token_value%>;'}。例如:

^{pr2}$

我将两种方式都放在这里:设置'X-CSRF-Token'HTTP头和发布csrfmiddlewaretoken参数。你可以删除一种方法后,相应的实验。在

如果对页面上的所有网格使用一些参数,则可以更好地更改默认值(有关详细信息,请参见here

jQuery.extend(jQuery.jgrid.edit, {
    recreateForm:true,
    reloadAfterSubmit:false,
    closeOnEscape:true,
    savekey: [true,13],
    closeAfterAdd:true,
    closeAfterEdit:true,
    ajaxEditOptions: {
        beforeSend: function(jqXHR) {
            // you should modify the next line to get the CSRF tocken
            // in any way (for example $('meta[name=csrf]').attr('content')
            // if you have <meta name="csrf" content="abcdefjklmnopqrstuvwxyz="/>)
            var csrf_token = '<%= token_value %>'; // any way to get
            jqXHR.setRequestHeader('X-CSRF-Token', csrf_token);
        }
    },
    editData: {
        csrfmiddlewaretoken: '<%= token_value %>'
    }
});

此设置对于“添加”和“编辑”窗体都是通用的。因此您可以使用简化形式的navGrid。在

jQuery("#list").jqGrid('navGrid','#pager');

根据jqGrid documentation,可以传递一个postData选项。 如果使用的是jQuery Cookie plugin,则可以添加如下内容:

postData: {
    csrfmiddlewaretoken: $.cookie(CSRF_COOKIE_NAME)
},

到你的jqGrid选项列表。在

CSRF_COOKIE_名称在django应用程序中设置设置.py默认为“csrftoken”。在

检查你的饼干。Django的CSRF还保存了一个cookie csrftoken,它的值与您将在表单中使用的CSRF_令牌相同。您可以使用任何Javascript cookie库来获取cookie并将其作为csrfmiddlewaretoken传递给POST请求。在

相关问题 更多 >