我写这篇文章是为了得到一些帮助“脱口而出”。我无法弄清楚如何将dict作为参数传递给web2py中的控制器。
目标:我需要将html5 sessionStorage传递给web2py控制器以验证它并使用它来生成订单购物车。
这就是我所拥有的:我有一个页面是产品目录。我使用html5 sessionStorage来收集订单。我看起来像这样:
{id:qty} e.g. {"1":"32", "15":"50"}
然后我有以下
jQuery('#cart').click(
function() {
alert("sending cart to server via ajax");
var order = JSON.stringify(sessionStorage);
console.log(order);
jQuery.ajax({
type: 'POST',
url: '/app/default/generateCart',
contentType: "application/json; charset=utf=8",
data: order,
dataType: 'json',
success: function(data) {alert('sent to server');}
});
});
这正确地将数据发送到我使用request.vars
的服务器所以问题是:如何将这个类似dict的结构传递给控制器?我可以使用JS生成链接并在其中放入一个完整的词典,但这似乎不安全,看起来像是不好的做法。
我确实读过这本书,但我提前道歉:我对这个问题有一点心理障碍,除了我做的事情之外我看不到,这是: (1) - 我将ajax发送到上面的控制器:generateCart() - generateCart()将request.args保存到session.order中,cart()控制器尝试从中检索。在cart()session.order为空。我可能不完全理解会话是如何工作的。 (2) - 我尝试将ajax制作到相同的控制器购物车(),但这也不起作用 - 它是空的
我很感激在这里练习的屁股,以及我错过的书籍参考。但关键qn是:如何将dict传递给控制器?
PS:是的,我是软件设计和网站开发的新手。我试图关注文档,但我想我陷入了困境(可以这么说)。谢谢。
答案 0 :(得分:0)
这个问题的快速回答是:ajax是正确的方法。我做得不对。这是更正后的代码:
// ajax request to server
function sendRequest() {
var order = JSON.stringify(sessionStorage);
console.log(order);
jQuery.ajax({
type: 'POST',
url: '/app/default/generateCart',
contentType: 'application/json; charset=utf-8',
data: order,
dataType: 'text',
success: function (data) {
console.log('callback success');
},
error: function() {
console.log('callback failed');
}
});
}
我从中学到的一件事是,即使数据已成功到达服务器,回调也可能失败。原因是dataType。我最初将dataType指定为JSON,这是回调所期望的。但是web2py现在使用JSON发送回调,但文本。因为那不是JS所期望的,它失败了。我认为它带有200以外的代码,但我不能相信这一点。所以,我认为您需要知道回调数据类型是什么。
因此,看起来生成JSON并通过IS发送它实际上是将复杂数据发送到服务器的最佳(或最简单)方式。虽然很明显,它需要对一个菜鸟进行一些阅读和测试。
这篇SO帖子也大量帮助:How do I return the response from an asynchronous call?。感谢Felix Kling的精彩总结。