redirect() 并未实际重定向(Pylons 路由)

1 投票
1 回答
1435 浏览
提问于 2025-04-15 14:50

我正在我的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 个回答

1

这个语法是可以用的,所以肯定还有其他问题。

路由的顺序很重要。有没有可能在重定向之前,有其他路由匹配了 /view,然后把它指向了一个返回404的控制器呢?

路由对结尾的斜杠也很敏感。你是不是在浏览器里不小心多打了一个斜杠,但在路由里没有,或者反过来?

最后,在 development.ini 文件里,如果你在 [logger_routes] 下设置 level = DEBUG,那么在访问 /view 后,你可以查看日志信息,看看匹配到了什么。

补充:我刚试着把一个匹配POST请求的规则放在同一路径的重定向之前,结果按预期工作了。你用的是最新的Routes版本(1.11)吗?否则我就没有其他建议了,因为我看不到代码。可能你可以从一个简单的测试案例开始,逐步增加内容直到出错,或者逐步减少内容直到正常工作……

撰写回答