wheezy.routing

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)])
wheezy.routing

相关文章:

你感兴趣的文章:

标签云: