上一篇: 下一篇:

google appengine中的url routing

2010年03月4日  |  9:17 上午分类:python  |  标签:  |  


在做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去处理,即:

  1. /member/1                                 成员ID为1的记录
  2. /member/1/page/2                成员ID为1的第2页记录
  3. /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]+))?/?

这个正则太狠了

转载时务必以超链接形式标明文章原始出处和作者信息。

5 位领导已批示 关于 “google appengine中的url routing”

  1. 不惊了 发表于: 三月 8th, 2010 5:18 下午

    15派森

  2. 文说有理 发表于: 三月 8th, 2010 5:33 下午

    google appengine 是什么?没听过

  3. 幻想曲 发表于: 三月 8th, 2010 8:09 下午

    @文说有理,
    请用google

  4. PJ.Hades 发表于: 七月 27th, 2010 7:21 下午

    为啥我在正则式中写了/?,但是URL末尾的/老是匹配不上……=。=
    诡异的是我自定义的404页面也没显示,就一个空白页面,但是在控制台日志中能看到是404了

  5. 幻想曲 发表于: 七月 29th, 2010 2:13 下午

    你的正则表达式是什么?


发表您的评论

1410168172122013183195114157619