Chen Yangjian's Blog

Carpe diem - Seize the day

Google App Engine 继续

| Comments

记一下最近遇到的一些问题和解决办法。

简洁 URL:都到了传说中的 post web 2.0 时代了,你不会还不知道简洁 URL 吧?例如:https://developer.mozilla.org/en/Canvas_tutorial 其后的 Canvas_tutorial 即是传入的参数。django 默认就是的,为我所知的一些 PHP 做的内容管理系统,也是的。因为 PHP 默认不是动态 URL(传入 /post/245,PHP 会去 post 目录下寻找名为 245 的文件),所以 CMS 之一 drupal 的的实现方式是将所有的后缀 URL 都作为参数 p 的值,即改成:/?p=/post/245。而 django 我就不知道了…… 唉,离题好远。其实我要说的是,Google App Engine 也是可以 fancy URL 滴,URL 正则表达式里头把需要作为参数的部分括起来,在相应的 RequestHandler 类里头,实现相应的 get,就是了。例如:

('/tag/(.*)', TagAction),


class TagAction(webapp.RequestHandler):
    def get(self, tag):
        print tag;

中文 URL:中文 URL 在协议里头是要被转换掉的,所以在 RequestHandler 里头如果直接拿来用的话会有问题。需要先用 urllib.unquote 转回来,再 decode 到项目本身使用的编码。例如:

tag = unicode(unquote(tag), 'utf-8')

函数动态召唤:以前写 PHP 的时候,经常会写出类似 “$foo = ‘funcname’; $foo()” 的代码,因为在应用到原本需要用 switch 场景的时候,实在很方便。所以在 python 里头自然也想这么写,办法很多,参考这里。除了 eval(),本质上大同小异,eval() 的话,少用为妙。例如:

some_object.__getattribute__('method_name')()

哈希表(dictionary)的排序:首先,哈希表是无序的!我们能做的只是把键取过来,现行排序,而后再根据排序好的列表去访问原先的哈希表。例如,根据值排序:

def sort_by_value(data):
    tags = data.keys()
    if len(tags) == 0:  return []
    tags.sort(lambda x,y: -cmp(data[x], data[y]))
    return tags

简洁的主键:这里说的是 Google App Engine 的数据模型。例如,定义一个 Tag,则除了自定义字符串以外,GAE 还会自动分配一个主键,可以通过访问该数据模型类的子函数 .key() 来获取,如 instance_of_tag.key()。但是直接拿来用产生的字符串很难看,类似 agtnYWlub3JzcGVuZHIOCxIGUmVjb3JkGPKrAQw。其实该类(指通过 .key() 获取来的 Key 类)附带了个函数叫做 .id()。所以,通常 instance_of_tag.key().id() 一下,取得一个整形数字,就比较好看了。自然也可以根据 id 获取数据,代码如下:

Spending.get(db.Key.from_path(Spending.kind(), spending_id))

废话这么多,其实永远不如自己看代码研究实际。

Comments