为什么HTTPFound不重定向页面

时间:2013-12-30 15:18:38

标签: python backbone.js pyramid

我有一个在save之后没有重定向的Backbone应用程序。我不知道这是否与Backbone或服务器端代码有关。

在服务器上:

url = request.route_url('test')
return HTTPFound(location=url)

我可以看到location在响应标头中正确设置为/test

1,但{@ 1}}请求200 OK,但页面未重定向。

1 个答案:

答案 0 :(得分:5)

因为您通过使用AJAX请求(Backbone save文档:http://backbonejs.org/#Model-save)进行保存,所以客户端不会被服务器响应重定向。这不仅仅是因为Backbone,这是AJAX请求的本质。如果要在成功保存后重定向,则需要通过在success的{​​{1}}选项中设置回调来手动执行此操作。 save回调将给出三个参数,模型,响应和选项(按此顺序),因此您可以使用服务器的响应来重定向。

在您的服务器中,您应该使用保存的模型呈现为JSON对象来响应成功保存。我做了什么然后重定向页面是我将目标位置添加到响应标头的location属性。您可以从成功回调中的success对象获取xhr属性,并在其上调用options以获取该位置,然后将getResponseHeader('location')指向该处:

window

我对Pyramid不太熟悉,所以如果有人想用最好的方法来编辑这个答案,那么返回JSON对象并修改服务器中的响应位置标题就行了。 According to these docsthese docs,它看起来应该是这样的:

model.save({}, {
  success: function(model, response, options){
    window.location = options.xhr.getResponseHeader('location');
  })
});

当然,您需要更改实际保存对象的所有内容,而不是创建示例from pyramid.view import view_config class MyObject(object): def __init__(self, x): self.x = x def __json__(self, request): return {'x':self.x} @view_config(renderer='json') def object(request): request.response.location = "http://LocationToRedirectTo.com" return MyObject(1) # the JSON value returned by ``object`` will be: # {"x": 1} 对象。