向web.Application对象传递的第一个参数URL路由器映射列表的配置方式是:用正则字符串进行路由匹配。
tornado的路由字符串有两种:固定字串路径和参数字串路径
1、固定字串路径
固定字串即普通的字符串固定匹配,如:
Handlers=[("/",MainHandler), #只匹配根路径
("/entry",EntryHandler), #只匹配/entry
("/entry/2021",Entry2021Handler), #只匹配/entry/2021
]
2、参数字串路径
参数字串可以将具备一定模式的路径映射到同一个RequestHandler中处理,其中路径中的参数部分用’()'标识,如:
handlers=[
((r"/entry/[^/]+"),EntryHandler),
]
class EntryHandler(tornado.web.RequestHandler):
def get(self,slug):
entry=self.db.get("select * from entries where slug =%s",slug)
if not entry:
raise tornado.web.HTTPError(404)
self.render("entry.html",entry=entry)
其中的/entry/([^/]+)定义"以/entry/开头的url"模式,url尾部的变量部分以参数的形式传递给RequestHandler的get()函数,在这里将该参数命名为slug
3、带默认值的参数路径
handlers=[((r"/entry/[^/]+"),EntryHandler),]模式定义了客户端必须输入路径参数,比如,能匹配如下路径:
http://xx.xx.xx.xx/entry/abc
http://xx.xx.xx.xx/entry/2021-03-28
但是无法匹配:
http://xx.xx.xx.xx/entry
对于需要匹配客户端未传入时的路径,则需要如下方法改变url路径和对get()函数的定义:
#url handler
handlers=[
((r"/entry/[^/]*"),EntryHandler),
]
class EntryHandler(tornado.web.RequestHandler):
def get(self,slug='default'):
entry=self.db.get("select * from entries where slug =%s",slug)
if not entry:
raise tornado.web.HTTPError(404)
self.render("entry.html",entry=entry)
首先是*取代了"/entry/[^/]+"中的+,然后为RequestHandler子类的get()函数的slug参数赋了默认值default
4、多参数路径
参数路径还允许在一个url模式中定义多个可变参数,如:
handlers=[
(r'/(\d{4})/(\d{2})/(\d{2})/([a-zA-Z\-0-9\.:,_]+)/?',DetailHandler),
]
class DetailHandler(tornado.web.RequestHandler):
def get(self,year,month,day,slug):
self.write("%d-%d-%d %s"%(year,month,day,slug))
在此定义的URL模式有四个参数,year,month,day,slug