google appengine中的url routing
在做rss4py的过程中发现这样的一个问题 ,直到现在也没有找到良好的解决方案。
def main():
webapp.template.register_template_library('filter')
application = webapp.WSGIApplication(
[
(r'/member/(?P<site>[0-9]+)/?', Main),
(r'/member/(?P<site>[0-9]+)/page/(?P<page>[0-9]+)/?', Main),
(r'/page/(?P<page>[0-9]*)/?', Main),
('.*',Error404),
], debug=True)
wsgiref.handlers.CGIHandler().run(application)
if __name__ == "__main__":
main()
在这里,有三种符合匹配条件的url被交给Main controller去处理,即:
- /member/1 成员ID为1的记录
- /member/1/page/2 成员ID为1的第2页记录
- /page/1 所有成页的第1页记录
Main Controller:
class Main():
def get(self,site = 0,page=1):
self.write('site : %s' % site)
self.write('<br />page: %s' % page)
return
当访问/member/1/时,输出:site:1 page:1
访问/member/1/page/2/ 时,输出: site:1 page:2
访问/page/3 时,输出:site:3 page:1
可以看出,前面二个URL的区配都是正确的,但第3个是错误的,需要的输出是:site:0 page:3,很明显,3被当成参数site被传递了,
如果单纯交换Main/get方法中site/page参数的顺序的话,第三个URL匹配正确,第一、二个就不正确了。
方案1:将URL规则做如下修改:
def main():
webapp.template.register_template_library('filter')
application = webapp.WSGIApplication(
[
(r'/(?P<site>member/[0-9]+)/?', Main),
(r'/(?P<site>member/[0-9]+)/(?P<page>page/[0-9]+)/?', Main),
(r'/(?P<page>page/[0-9]*)/?', Main),
], debug=True)
wsgiref.handlers.CGIHandler().run(application)
if __name__ == "__main__":
main()
修改后的URL规则中将member/page都做为参数传递到Main的get方法中,即访问/member/1/page/5时,get方法中的site参数值为member/1,page参数值为page/5,这样轻易分析一下就能得到正确的site/page值。
方案2:一个URL规则搞定:
(?:/member/(?P<site>[0-9]+))?(?:/page/?(?P<page>[0-9]+))?/?
这个正则太狠了
派森