通过AJAX将JavaScript数组传递给cherrypy

1 投票
1 回答
934 浏览
提问于 2025-04-18 05:22

我正在尝试把一个数组发送到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循环中的'alerts'是空的,这意味着数组没有通过ajax调用传递过来(至少这是我的猜测)。

有什么想法吗?

1 个回答

0

你应该直接用 $.ajax 这样调用:data: {alerts: alert_ids},而不是用 data: JSON.stringify({alerts: alert_ids})

另外,去掉 contentType : "application/json", 这一行。CherryPy 的方法是期待表单编码的格式,而不是 JSON 格式。

如果你设置了 traditional: true,那么在 CherryPy 中的 alerts 参数后面就不能加大括号;如果没有设置这个选项,就必须加上大括号。

撰写回答