为什么HTTPFound不重定向页面

el_*_*_le 0 python backbone.js pyramid

我有一个Backbone应用程序,不会重定向后save.我不知道这是否与Backbone或服务器端代码有关.

在服务器上:

url = request.route_url('test')
return HTTPFound(location=url)
Run Code Online (Sandbox Code Playgroud)

我可以看到在响应头中location正确设置了/test它.然后有一个200 OK的请求/test但页面没有被重定向.

Rus*_*oms 5

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

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

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

我对Pyramid不太熟悉,所以如果有人想用最好的方法来编辑这个答案,那么返回一个JSON对象并修改服务器中的响应位置标题就行了.根据这些文档这些文档,它应该看起来像这样:

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}
Run Code Online (Sandbox Code Playgroud)

当然,您需要更改所有内容以实际保存对象,而不是创建示例MyObject对象.