我试图建立一个这样的网站
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),
答案 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
成功。