问题:如何为整个站点设计一套URL处理和调度的方案?
解决方案:webpy的URL处理方案简单但是强大和灵活。在每个应用的顶部,你经常会看到一个在元组中定义的完整的URL调度方案。例如:
urls = ( "/tasks/?", "signin", "/tasks/list", "listing", "/tasks/post", "post", "/tasks/chgpass", "chgpass", "/tasks/act", "actions", "/tasks/logout", "logout", "/tasks/signup", "signup" )
这个元组的格式是:url-pattern-path,handler-class 这种模式会重复定义更多的URL模式。如果你不理解URL模式和处理类之间的关系,请查看Hello World example或者Quick Start Tutorial在你
阅读cookbook的其他部分之前。
路径匹配 path matching
你可以使用强大的正则表达式去设计更加灵活的URL模式。例如,/(test1|test2)会匹配/test1或/test2两者中任意一个。关键在于理解匹配发生在你的URL的路径上。
例如,以下的URL:
http://localhost/myapp/greetings/hello?name=Joe
该URL的路径是/myapp/greetings/hello 。webpy会在内部添加一个 ^ 和 $ 到url模式,这样,/tasks/就不会去匹配/tasks/addnew 这样的模式。当匹配路径时,你不能使用这样的模式:/tasks/delete?name=(.+)作为?后面的部分被称为query(字串),所以不能被正确匹配到。关于URL更详细的描述,请参考web.ctx。
捕获参数 capture parameters
你可以把在URL模式中捕获到参数用于你的处理类中:
"/users/list/(.+)", "list_users"
在list/之后被捕获到的数据块可以作为参数被用在GET或者POST中:
class list_users: def GET(self, name): return "Listing info about user: {0}".format(name)
你可以定义多个参数。还要注意,URL字串中的参数(即出现在?后面的那部分)可以在使用web.input()被获取到。
在意在子应用中的情况 Note sub-application
为了更好的处理更大的web应用,webpy还支持sub-application 当你在给子应用设计URL方案时,请牢记,路径(web.ctx.path)会让父路径被剥夺。例如,如果在主应用中,你定义一个URL模式/blog
跳转到blog子应用,在你的blog子应用中所有的URL模式都会以 / 开始而不是 /blog 。查看 web.ctx 获取cookbook规则更多的细节。