上面的例子我们构建了一个简单的只有一个单独路由的应用。如果一个应用只能绑定一个路由是多么枯燥的事情。我们可以添加更多。
@route("/")
@route("/hello/<name>")
def hello(name='Stranger'):
return template("Hello {{name}}, How are you?", name=name)
这个例子解释了两件事情:
1. 你可以绑定一个或者多个路由到一个简单的回调,并且你可有添加占位符到URL并且通过关键字参数访问。
动态路由
含有占位符的路由就被叫做动态路由(和静态路由相对立)并且可以匹配一个或者多个URL在同一时间。
一个简单的占位符就是<>之间包含一个名字并且在下一个/之前包含一个或者多个字符。
例如:路由/hello/<name>接受请求/hello/alice, 或者 /hello/bob, 但是不是/hello, /hello/, /hello/mr/smith
每一个占位符传递URL中相关的部分作为一个关键字参数给请求的回调函数也就是route绑定的函数。
你可以立刻使用这种方式去实现RESTful,漂亮的,有意义的URL。例如:
@route('/wiki/<pagename>') #match /wiki/Learning_Python
def show_wiki_page(pagename):
....
@route('/<action>/<user>') #match /follow/bee1314
....
在新的0.10版本。过滤器被用来定义更细节的占位符,或者在传递给回调函数之前转化URL中将要传递给回调函数的部分。
一个过滤器占位符被声明如:<name:filter>或者<name:fiter:config>.可选config的部分的语法依赖于使用的filter。
下面的filter就是已经默认实现的或者更多的将要被加入的:
1. :int 只能匹配(signed有符号)数字并且将其值转化为integer整型。
2. :float 只能匹配浮点型将其转化为decimal 数字。
3. :path 匹配所有的字符包括/
4. :re 允许你去制定一个自定义的正则表达式在config域中。
@route('/object/<id:int>')
def callback(id):
assert isinstance(id, int)
@route('/show/<name:re:[a-z]+>')
def callback(name):
assert name.isalpha()
@route('/static/<path:path>')
def callback(path):
return static_file(path, ...)