wheezy.routing 纯python实现, 不依赖于其他python包 用来将 URL patterns(模式可以是 简单的字符串,curly表达式, 曾则表达式)映射到 handlers 不限制 handler如何实现.
映射可以包含其他映射,也可动态构造
from wheezy.routing import PathRouterr = PathRouter()r.add_routes([ ('/', hello_world), ('/{any}', not_found)])def main(environ, start_response): handler, kwargs = r.match(environ['PATH_INFO']) return handler(environ, start_response)
/{any} 这个模式是 curly expression(柯里表达式), 它会被翻译成 正则表达式(regular exression)
模块化组织URL
server_urls = [ url('time', server_time, name='now')]all_urls = [ ('', welcome), ('server/', server_urls)]all_urls += [ url('{url:any}', not_found)]
可以看到, server_urls 被包含在 父级路径 server/ 下面
所有,以 server/ 开头的 url 都会被映射 到 server_urls 里
pattern 和 handler
可以在pattern和handler之间创立映射关系
urls = [ ('posts/2003', posts_for_2003), ('posts/{year}', posts_by_year), ('posts/(?P\d+)/(?P\d+)', posts_by_month)]
分别是普通字符串, 柯里表达式, 正则表达式
最终都是由 正则表达式 实现
Curly表达式 在bottle和flask中的是一样 i, int, number, digits 表示一个或者多个数字 w, word 表示一个多个单词 s, segment, part 表示 任何东西, 遇到一个 / 符号(路径分割符)为止 *, a, any, rest 匹配任何东西
在{}中其他 模式,会被解释为 正则表达式
{locale:(en|ru)}/home => (?P(en|ru))/home
也就是说 en/home ru/home 都是有效的URL
curly也支持可选参数(用[]括起来)
[{locale:(en|ru)}/]home => ((?P(en|ru))/)?home
这样子的话 en/home ru/home home 都是有效的URL
Curly表达式的其他例子
posts/{year:i}/{month:i}account/{name:w}
添加额外的参数
urls = [ ('posts', latest_posts, {'blog_id': 100})]
url辅助函数 wheezy.routing.route.url() 函数可以让你用一种更容易的方式构造url映射
from wheezy.routing import urlurls = [ url('posts', latest_posts, kwargs={'blog_id': 100})]
为映射命名
Named Mapping 你建立的每个路径映射,都会在 handler名称之后自动命名. 规则是, 转换handler的名称,从驼峰命名(camel case)到 下划线命名(underscore name), 并移除 任何 以 handler或者 controller结尾的字符 比如: LatestPostsHandler 就被转成 latest_posts 你也可以明确 为 mapping指定一个名字
urls = [ url('posts', latest_posts, name='posts')]
添加路由 如果你已经有了一个PathRouter类的实例, 可以调用它的add_routes()方法来添加 模式到你的映射中
r.add_routes([ ('/', hello_world), ('/{any}', not_found)])