日志分类:python

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]+))?/?

这个正则太狠了

臭蛋聚测试版发布

2010年02月25日 11:13 上午  |  分类:python

臭蛋聚是一个RSS聚合器,构建在Google App Engine上的,写的这个小应用是用来取代原有的feed.yibin001.com(和谐了)。

有段时间没写gae的小应用了,刚开始时还显得有点陌生,在此期间也遇到一些小问题,在这里一并写出来,希望对初次开发gae应用的朋友有一个帮助。

  1. gae datastore,在gae中,所有Gql的排序字段都是需要建索引的,否则会出现经典的”NeedIndexError: no matching index found.”错误,附在错误后面的信息就是需要建立的索引,你可以复制下来,然后粘帖到index.yaml文件,并上传。上传后并不能马上使用,gae需要一个build的过程,这个时间长短要看数据量的大小,索引状态变成Serving时就意味着索引已创建成功。
  2. Gql查询结果排序问题。排序的字段要有值,不能为None,否则结果集可能不是你所需要的。如:SELECT * FROM Feeds ORDER BY LastPubDate DESC,如果此时的LastPubDate都没有值,即使有10条数据,这条查询无法返回记录的。
  3. 对于GMT(rfc822)时间格式的解析。按rss标准,PubDate正确格式应该是Sat, 20 Feb 2010 07:04:52 +0000,直接用datetime模块解析不是很方便,可以用rfc822模块中的parsedate_tz函数进行转换。对于非标准GMT(rfc822)格式的时间,只能配合正则进行解析。

最后,臭蛋聚的地址为:http://rss4py.appspot.com/

可爱的python之切片操作符(Slice)

2009年11月18日 4:33 下午  |  分类:python

什么是切片?

字符串、列表、元组在python中都符合“序列”这一特征,只要符合这一特征的变量我们都可以用切片(slice)去存取它们的任意部分。我们可以把序列想像成一个队列,我可能需要前面三位、后面三位、或从第三位后的四位、或隔一个取一个等,我们用切片操作符来实现上述要求。

切片操作符在python中的原型是
[start:stop:step]

即:[开始索引:结束索引:步长值]

开始索引:同其它语言一样,从0开始。序列从左向右方向中,第一个值的索引为0,最后一个为-1

结束索引:切片操作符将取到该索引为止,不包含该索引的值。

步长值:默认是一个接着一个切取,如果为2,则表示进行隔一取一操作。步长值为正时表示从左向右取,如果为负,则表示从右向左取。步长值不能为0

全文阅读 »

可爱的python之语句与语法

2009年11月15日 5:25 下午  |  分类:python

注释(#)

python中的注释是以#开头的,不像c++中有/**/之类的多行注释。

继续(\):表示继续上一行,通常情况下,一行表示一个语句,一行过长的语句可以使用\进行分解

语句块(:):在c#/php/javascript/c++中,对于复合语句是用{}来标识,而在python中,是用:配合缩进来实现语句块,如:

if a>0:
    #todo
else:
    #todo

全文阅读 »

Pages: 1 2 3 »