Pylons/Routes 重写 POST 或 GET 为美观 URL
我想要的行为:
用户打开我的“搜索”页面,网址是 www.site.com/search,输入他们的查询内容,然后点击提交,最后他们会看到的网址是 www.site.com/search/the+query,而不是 www.site.com/search?q=the+query。我已经阅读了很多Pylons的文档,刚刚看完路由(Routes)的部分,想知道这种情况是否应该在路由层处理。我已经设置好我的应用程序,可以在输入 www.site.com/search/the+query 时进行搜索,但我不知道怎么把表单发送到这个地址。
或者说,这个操作应该在控制器里用 redirect_to() 来处理吗?
还是应该在其他地方处理呢?
后续问题:
这现在并不是一个“必须实现”的需求,更多的是对未来功能的想法。我正在设计一个使用维基百科数据的应用,发现当用户在维基百科上搜索时,如果搜索内容不太模糊,它会直接跳转到一个文章链接,比如 en.wikipedia.org/wiki/Apple。实际上,它在执行一个中间的 HTTP 302 重定向步骤,我只是好奇在 Pylons 中有没有更优雅或更有趣的方法来实现这一点。
2 个回答
HTML表单的设计是为了将数据发送到一个特定的网址,并附带一些查询参数(比如?q=
),或者在POST
请求中包含相应的数据。你可以选择写一些巧妙的JavaScript代码来拦截表单提交,然后按照你喜欢的方式重新处理这些数据,或者使用redirect_to
(不过这样做会有点麻烦)。
但是,为什么你需要这么复杂的操作,而不直接按照标准流程来呢?请用应用层面的需求来解释一下你的使用场景…!
你可以发送任何内容到任何网址,但如果你想让某个特定的网址出现在浏览器的地址栏里,你就得使用重定向。这和你在服务器端使用的是Pylons、Django还是Rails没有关系。
在处理 /search
的时候(无论是 POST
还是 GET
),通常会在后台运行查询。如果只有一个搜索结果(或者有一个特别相关的结果),你就会重定向到那个结果;否则,就会重定向到一个页面,显示前N个结果的链接。这是我所知道的正常做法。