GAE 编程指南读书笔记

GAE 和我蛮有缘分,我初学 Python 的其中一个原因就是当时 GAE 刚推出, 当时想法是免费的应用要用起来,要不然就浪费了。随后也假模假样的看文档, 就是没有什么产出。 去年写了一个小应用 dbevent2gc , 期间发现 GAE 和普通程序开发的诸多不同,又遭遇 GAE 配额大幅缩水, 写出来的应用运转的不太稳定。在南京图书馆的架上看见这本《GAE 编程指南读书笔记》, 立即借回家仔细阅读。 GAE 的简介 运行时环境 Python / Java 数据存储 Datastore(实体 / 查询 / 索引 / 事务) 服务(Memcache / GAccount / 任务队列 / 计划任务) 工具(SDK / appcfg / dev_appserver / 控制台) 入门(安装 / GAccount / webapp / app.yaml / /_ah/admin / 注册部署 / login:required) 处理流程:请求 - 前端 - 引用服务器 / 静态文件服务器 - 服务 配额限制:请求限制 / CPU 限制 / 服务限制 / 部署限制 (最新配额:http://code.google.com/intl/zh-CN/appengine/docs/quotas.html) 数据存储 GAE 的数据存储方式和传统的 RDBMS 差异比较大,更类似于对象数据库。 类别 kind / 键 / 键名 key name 可以通过键来获取和操作对象 e = db.get(db.Key('Entity', 'alphabeta')) / e = Entity.get(k) e = db.get(k) e.delete() / db.delete(e1, e2) / db.delete(k) Expando 基类可以任意扩展属性,Model 基类则不可。 GAE 中基本类型与 Python / Java 中基本类型的差异 多值属性 数据查询 查询和类别 db.query() query.filter() query.order() 查询和键:查询结果要么返回实体,要么返回键( key_only=True ) 可以用 GQL 写查询语句,不能写 CUD 获取结果: fetch() 索引 每条查询都需要维护一条索引,在 index.yaml 中可以配置 排序之后的索引查询很快,查询效率和返回结果集有关 实体的每个属性会自动维护两条索引:升序和降序 查询时候选取对应的索引进行查询,条件语句可能和排序语句相冲突 不等于 / IN 操作符将引发一系列变换出的查询 多值字段的索引:每个值会成为索引中一行 / 实体会因此分散 / 取第一次成功扫描到的行 多值会引入爆炸索引问题 事务 通过实体组来控制事务,实体组会在同一块存储区 GAE 使用乐观锁 使用 AModel(parent=p) 构造祖先,然后通过 run_in_transation() 回调事务处理函数 BigTable 中使用日志+时间戳来跟踪实体的修改,保证数据并发和一致性 事务更新和索引更新:可能返回的索引结果和实体不一致 Python 数据建模 声明 / 类型 / 验证( validate() ) 不编入索引的属性 indexed=False 时间类型的自动值 模型变化带来的维护问题:修改属性类型 / 添加一个必要属性是不向后兼容的。 关系建模 db.ReferenceProperty collection_name 多对多关系的处理 键列表方法:使用多值属性 链接模型方法:相当于中间表概念 模型的继承:通过 db.PolyModel 实现多态查询 Memcache CRUD 获取 URL 资源 urlfetch() RPC 异步请求调用,闭包调用 邮件和 XMPP 额,亲用到时候看 Google 官方文档吧~ 大批量数据操作和远程访问 /remote_api Bulk Loader 大量数据操作 远程 shell remote_api_shell.py app-id 任务队列和计划任务 队列: queue.yaml / 令牌桶 计划任务: cron.yaml 都是通过设定主动触发某个 url Django 看 Django 文档吧,亲~ 部署 上传 appcfg.py update ./clock 通过 url 使用特定版本: version-id.latest.app-id.appspot.com 版本只维护代码,数据库还是同一份 下载日志 appcfg.py request_logs clock logs.txt

2012-03-24 · alswl

dbevent2gc v0.1发布

Thumbnail

重要通知:Log4D的域名由 http://dddspace.com 迁移到 http://log4d.com 。 订阅地址现在改为 http://log4d.com/feed 和 http://feeds.feedburner.com/dddspace 。(FeedBurner的地址未发生变化) http://feed.dddspace.com 弃用 请订阅我博客的朋友更新一下订阅地址。 关于dbevent2gc A application to sync douban.com events to Google Calendar. dbevent2gc是一个GAE应用,它将豆瓣同城的活动同步到Google Calendar的日历, 允许用户订阅活动而知道最近几周周边将发生活动。 dbevent2gc是基于Python/web.py/mako/iCalendar的,源代码地址在 https://github.com/alswl/dbevent2gc 使用方法 目前dbevent2gc运行在GAE上面,地址是 http://dbevent2gc.appspot.com (墙外) http://dbevent2gc.log4d.com/ (我做的本地反向代理) 登录这个地址可以选择需要订阅的城市和活动类型,然后会生成一个按钮, 点击这个按钮可以直接将选择的活动订阅到Google日历。 ...

2011-11-25 · alswl

最简陋的GAE代理

年前换了一次服务器,之后发现Lifestream的Errors飙升到1000+错误,检查一下,发现是获 取不了豆瓣的rss链接。正好这台主机支持SSH,连入之后CURL了一下豆瓣服务器,发现Time out。 紧接着发现中国内的所有域名都无法使用CURL获取,联系小张之后,得知该主机曾经被入侵过,于是屏蔽了中国大陆的ip段(囧~入侵和中国ip有毛关系) 遂想用GAE做个代理服务器,反正获取RSS也只要Get一下,代码没几句。把这项任务放入Toodledo之后,就一直没去弄,今天发现GAE Laucher升级了,就部署到自己GAE上了。 ...

2011-01-11 · alswl

PylexChat可行性分析

PylexChat介绍 PylexChat取名自Python+Flex+Chat部 分缩写,这就意味着这个系统是基于Python+Flex的聊天系统。之所以做这个系统,源自我大学的最后一次课程设计,我不想浪费这最后一次可以供我发 挥自己想象力的机会。年后估计要参加工作了,毕业设计也不敢做这么有想法的课程设计。那就最后一次潇洒一下,做一个我完全没有接触过的东西。 我几乎不会Python,是最近一个月迷上这门强悍而简单的语言,我完全不会Flex,是最近1周时间才开始接触Flex。这意味着这次课程设计的 风险挺大。我花了几天的时间做了详细的可行性分析,分析了系统框架和GAE能够提供的服务和限制以及Flex/AIR能做的内容,否决了几个方案,最后总 结了一篇简单可行性分析(本文是一周时间慢慢形成的,并没有遵循正规的开发文档风格)。 ...

2009-11-23 · alswl

Google App Engine搭建Twitter API Proxy教程

来源:Google App Engine搭建Twitter API Proxy教程 alswl:今天我本来想使用GAppProxy搭建自己的[服务器](http://j asontiproxy.appspot.com/fetch),不过失败了,似乎客户端有些问题,也可能是我配置的问题。之后就正好看到月光大大的这篇文章,欣喜之 极,搭建了自己的Twitter birdnest服务器,并转载之。 本文将介绍如何通过Google App Engine搭建基于Python 2.5的BirdNest环境,建好的BirdNest可以在TwitterFox或twhirl中使用。 ...

2009-10-14 · alswl

GAE+校内App初接触

Thumbnail

下午刚有了在Google App Engine上写校内(人人网)App的想法,下午就迫不及待的开始动手。下面我以一个简单的Hello World来介绍一个开发步骤。 1.创建GAE应用 建立一个Google App Engine空间,需要一个Google帐号,仅此而已。拥有帐号,进入 App Engine ,激活这个服务,就可以创建新的应用。如何创建不是我这里要讲的重点,现在GAE支持简体中文版本,应该没有任何问题。 一个简单的App控制台 2.部署GAE App 刚才建立的GAE App其实还是空的,如果访问xxx.appspot.com时候,你会发现什么都出不来(按理应该是404页面,但是由于连404页面都没有设置 ,所以Nothing,检查http状态会发现返回的是404状态)。 这时候我们就要开始部署这个GAE App了:1.下载一个Google App Engine SDK for Python-Win,这样就可以在本地测试项目,然后发布到 GAE。 用这个GAE Launcher在本地创建了一个Application,注意标识符和你网上申请的要一致。然后会自动生成一个包含"」Hello Word!「的main.py和app.yaml的文件夹。其中app.yaml的内容是用来配置项目的。 相关链接:app.yaml的具体设置 我创建了一个名为jasontidemo的App,并且启动服务器,可以进行浏览。 在一切没有问题之后,我们就可以惦记Deploy部署这个项目了,这时候要输入帐号和密码,然后出现console控制台等待信息。出现下面提示时候,就说明上传成功 了。 Closing update: new version is ready to start serving. Uploading index definitions. Password for alswlwangzi@gmail.com: 2009-09-27 16:00:36 (Process exited with code 0) 这时候我们就可以打开xxx.appspot.com查看刚才部署的网站。 3.校内应用 拥有校内帐号,就可以创建校内应用。第一步是需要安装一个名为「开发者」 的应用。通过这个应用,可以链接到其他一些有帮助的内容:开放平台文档、测试工具、讨论区。 第二步是创建一个新的应用,按部就班的填上相关资料。 校内开发者,右上角可以申请开发应用(看讨论区貌似童鞋们都不满意这个开发平台呢) 我的应用程序,在这里可以编辑应用的属性 创建之后,就可以填上Canvas的基本选项中的「应用展示地址」和「Canvas Callback URL」,后者就是实际的地址,我们将填上刚才的xxx.appspot.com这种形式的网址。 最后测试自己的应用,也就是刚才「应用展示地址」,形式类似于apps.renren.com/xxx/,就可以看到我们的应用了,这时候基本框架就差不多了。 4.噩耗 此时当满天欢喜时候打开刚才的「应用展示地址」,你会惊奇的发现校内居然报错了,直接报了405错误。什么是405错误,就是服务器没有权限访问。 我花了一下午时间才解决这个问题,因为问题可能出在校内,也可能是GAE的功能限制上。 在appspot上测试这个应用是没有任何问题的 显示的源码,其中的xnml校内服务器自己可以解析出来的,这段代码在校内测试工具也能通过 调试之后,终于把问题锁定在get 和post上,具体原因是因为校内发起请求GAE服务器用的是Post方法,而我们的main.py中目前只相应get方法,导致了校内请求GAE Post方法,服务器没有这个方法调用,就返回了405错误。 修复这个问题只给main.py的MainHandler这个类加上post方法 class MainHandler(webapp.RequestHandler): def head(self, *args): return self.get(*args) def post(self): self.response.out.write’Hello world!') 5.结合 最后我加上一个简单的<xn:profile-pic />来展示一下整个App 下面我发布我的这个简单的Hello World!(其实因为要使用XNML,所以已经不是单纯的打出Hello World了) app.yaml:定义了main.py和404页面 application: jasontidemo version: 1 runtime: python api_version: 1 handlers: url: / script: main.py url: /index.html script: main.py url: /.* script: not_found.py main.py:我把post 和get写的比较Dirty,其实可以封装在一个函数里的。 import wsgiref.handlers from google.appengine.ext import webapp class MainHandler(webapp.RequestHandler): def head(self, *args): return self.get(*args) def post(self): self.response.out.write(’’’使用者的名称及其大中小三种头像: 图片: <xn:profile-pic uid=“loggedinuser” linked=“true” size=“tiny”/> <xn:profile-pic uid=“loggedinuser” linked=“true” size=“normal”/> <xn:profile-pic uid=“loggedinuser” linked=“true” size=“main”/> 姓名: <xn:name uid=“loggedinuser” linked=“true” shownetwork=“true” /> ''') def get(self): self.response.out.write(’’’使用者的名称及其大中小三种头像: 图片: <xn:profile-pic uid=“loggedinuser” linked=“true” size=“tiny”/> <xn:profile-pic uid=“loggedinuser” linked=“true” size=“normal”/> <xn:profile-pic uid=“loggedinuser” linked=“true” size=“main”/> 姓名: ...

2009-09-28 · alswl

当Google APP Engine遇上校内

Thumbnail

昨天看《程序员》时候看到一篇讲开放接口的文章,是FaceBook的一个开发人员写的,讲了很多关于开放平台的东西 。其中提到Google App Engine的云计算支持,FaceBook的FBML(校内的称为XNML,一种标记性语言)。 Google App Engine(GAE) Google App Engine让用户可以在 Google 的基础架构上运行的网络应用程序。Google App Engine 应用程序易于构建和维护,并可根据用户的访问量和数据存储需要的增长轻松扩展。使用 Google App Engine,将不再需要维护服务器:用户只需上传用户的应用程序,它便可立即为用户的用户提供服务。 通俗的说,App Engine就像是免费提供的一个500M高性能的空间,和一个appspot.com二级域名。在Google强大的云计算能力下,服务器的速度 和质量毋容置疑。现在App Engine支持Python和Java(似乎Java有些限制,具体的细节我没有看)。 ...

2009-09-27 · alswl