通过JavaScript数组与AJAX来的CherryPy(Pass JavaScript arra

2019-10-20 01:28发布

我试图发送一个数组CherryPy的,但事实证明空。

这是我的js文件。 我检查和数组被填补,因为它应该。

$(function () {
$('#mark-read').on('click', function (e) {

    alert_ids = [];
    $("input:checkbox[name=alert-cb]:checked").each(function() {
        alert_ids.push($(this).attr('id'));
    });

    $.ajax({
      type: 'POST',
      url: 'markasread',
      data: { alerts: alert_ids },
      traditional: true,
      success: function (data) {
        alert(data);            
      }
    });
});

});

这是CherryPy的部分(我用这个答案作为一个准则)

@cherrypy.expose    
def markasread(self, **alerts_ids):

    """ Mark alerts as read """

    a_ids = alerts_ids.pop('alerts[]', [])
    alerts.mark_as_read(a_ids)

    return json.dumps(a_ids)

这是从上面的Python代码被调用的函数

def mark_as_read(alerts):
  alerts_file = ET.parse(ALERTS_FILE)
  root = alerts_file.getroot()  

  for a_id in alerts:
    alert = root.find("./alert[@id='" + a_id + "']")
    alert.set('status', 'watched')

  alerts_file.write(ALERTS_FILE)    

我的目标是将数据保存到一个XML文件。 我已经成功地保存到类似的代码,XML文件。 问题是,“警告”中的for循环是空的,这意味着阵列没有与Ajax调用(至少这是我的猜测)通过。

有什么想法吗?

Answer 1:

你应该叫$.ajax简单地用data: {alerts: alert_ids}而不是data: JSON.stringify({alerts: alert_ids})

此外,删除contentType : "application/json",行。 CherryPy的暴露方法需要窗体-urlencoded格式,而不是JSON。

如果将traditional: true ,你不能后加括号alerts在CherryPy的参数,否则就必须添加它们。



文章来源: Pass JavaScript array to cherrypy with AJAX