redirect() 并未实际重定向(Pylons 路由)
我正在我的Pylons应用中构建一个路由表,但我发现redirect()没有按照预期工作。我不太确定自己哪里出了问题。
这里有一个来自Routes文档的redirect()使用示例:
map.redirect("/home/index", "/", _redirect_code="301 Moved Permanently")
这是我在routing.py文件中的内容:
map.redirect("/view", "/", _redirect_code="301 Moved Permanently")
在我的routing.py文件末尾,有一个使用redirect()的路由:
map.redirect('/*(url)/', '/{url}', _redirect_code="301 Moved Permanently")
这个路由工作得很好,所以我知道redirect()是存在并且可以正常使用的。因此,我在/view的重定向上出了问题。我知道这一点是因为当我在浏览器中访问/view时,我看到的是404页面,而不是被重定向。访问/是没问题的,所以我认为问题不在这里。我觉得Routes中的redirect()是个好主意,我想按照预期使用它,但我不确定自己哪里做错了。
补充说明 @jasonjs:我认为没有其他路由匹配。当我尝试访问/view,然后查看Paster的输出时,得到的结果是:
21:22:26,276 DEBUG [routes.middleware] No route matched for GET /view
这对我来说似乎是很有说服力的。我还应该提到,有一个路由可以匹配对/view的POST请求:
map.connect('/view', controller='view', action='search', conditions=dict(method=['POST'])
这个路由也能正常工作,我把它放在routing.py的前面,这样它会先尝试匹配这个路由,再去匹配/view[GET]路由。
1 个回答
这个语法是可以用的,所以肯定还有其他问题。
路由的顺序很重要。有没有可能在重定向之前,有其他路由匹配了 /view
,然后把它指向了一个返回404的控制器呢?
路由对结尾的斜杠也很敏感。你是不是在浏览器里不小心多打了一个斜杠,但在路由里没有,或者反过来?
最后,在 development.ini
文件里,如果你在 [logger_routes]
下设置 level = DEBUG
,那么在访问 /view
后,你可以查看日志信息,看看匹配到了什么。
补充:我刚试着把一个匹配POST请求的规则放在同一路径的重定向之前,结果按预期工作了。你用的是最新的Routes版本(1.11)吗?否则我就没有其他建议了,因为我看不到代码。可能你可以从一个简单的测试案例开始,逐步增加内容直到出错,或者逐步减少内容直到正常工作……