如何将具有可选捕获组的不同URL指向同一个Handler?

时间:2014-05-21 19:20:37

标签: python tornado

我试图建立一个这样的网站

example.com/mx/about - >墨西哥关于页面 example.com/us/about - >美国关于页面 example.com/about - >国际关于页面

在处理程序中,我可以

(r'/([A-Za-z]{2})/about/?', AboutPageHandler),

它捕获两个字母的国家/地区代码,但如果URL没有两个字母的国家/地区代码,则服务器将404而不是指向AboutPageHandler。

有没有办法让双字母国家/地区代码可选,如果不存在,会重定向到国家/地区无代码网址?或者我必须对我的所有处理程序执行此操作

(r'/([A-Za-z]{2})/about/?', AboutPageHandler),
(r'/about/?', AboutPageHandler),

1 个答案:

答案 0 :(得分:2)

是的,您可以通过在?之后放置正则表达式的relvant部分:

import tornado.web
from tornado.ioloop import IOLoop

class AboutPageHandler(tornado.web.RequestHandler):
    def get(self, lang=None):
        self.write("HI {}\n".format(str(lang)))


if __name__ == "__main__":
    app = tornado.web.Application([
       #(r'/([A-Za-z]{2})/about/?', AboutPageHandler)       # Old, busted regex
        (r'/(?:([A-Za-z]{2})/)?about/?', AboutPageHandler)  # New, hot regex
        ])  
    app.listen(8888)
    IOLoop.instance().start()

正如您所看到的,我们已经将您的正则表达式与国家/地区代码及其尾部斜杠相匹配,并将其置于可选内(使用?中的(stuff)?about) ,非捕获(使用(?:stuff))组。现在,当您尝试连接到任一页面时:

dan@dantop:~> curl localhost:8888/about
HI None

oreild1@dantop:~> curl localhost:8888/about
HI mx

成功。