在GAE中使用web.py
1 前言
GAE,全称Google App Engine, 是一个由google提供的互联网应用服务引擎,让开发人员可以使用GAE的API开发互联网程序,而不用担心主机、带宽等问题。自己也是刚刚接触到GAE,尤其感兴趣的是GAE能够支持Python。于是赶紧注册了GAE,鼓捣了一下午,搭建了GAE下的web.py开发环境。期间遇到了各种问题,还是多亏了Google大神,最后一一解决。于是把遇到的问题都总结下来,就成了这篇博文。
2 GAE的注册,安装
GAE的申请过程并不复杂,网上的教程也很多。下面简单介绍一下整个流程:首先你需要注册一个Gmail账户,然后到GAE的主页http://appengine.google.com/ 上用这个账户填写申请 。之后会有一个短信验证的过程,需要填写一个移动或联通的手机号码,(天翼的我试过了,的确什么都收不到,后来换了个移动号,果然很快收到验证码)。填好验证码后,下一步填一下二级域名和应用程序的名字,提交后申请就成功。
下一步就是到http://code.google.com/intl/zh-CN/appengine/downloads.html 下载GAE SDK,目前官方只提供Java和Python两个版本。我下载了GAE SDK for Python的Linux版本。windows版本是msi文件,直接点击安装即可,而Linux版本其实更简单,说明文档里就一句“Unpack the zip file”,也就是直接解压就完事了……
3 在GAE中使用web.py
GAE支持的Python版本是2.5,而我的Fedora 15上默认装的是Python2.7.1,担心会有兼容性问题,于是重新下载安装了Python2.5。然后学着官网上的例子(看这里http://code.google.com/intl/zh-CN/appengine/docs/python/gettingstarted/helloworld.html ), 写了个最简单的Hello World及其配置文件,放在HelloWorld文件夹下 。然后使用GAE SDK中提供的网络服务器进行测试:
google_appengine/dev_appserver.py HelloWorld/
最初报错:‘module’ object has no attribute ‘HTTPSHandler’, 原因是新装的python2.5编译的时候没有包含ssl,所以重新编译一下就好了,具体见此文:http://www.geektu.com/?p=78
然后又报错:No module named _sqlite,检查了一下,机子上有装sqlite,google后,得知需要安装sqlite-devel,之后重新编译即可。
改掉这两个错误之后,再次测试报错出来个正则表达式,忘了copy下来。看了下明白原来应用程序名不能用大写字母,于是改成helloworld。
之后又遇到了:google.appengine.tools.dev_appserver.AppConfigNotFoundError,这个错误是由于配置文件app.yaml出错造成的,网上普遍提到的是文件名一定要是app.yaml,还在一篇博文里看到说yaml的语法非常严格,连空格都不能错(具体见这里:http://blog.csdn.net/kyleinhustgs/article/details/3871031 ,未测试)。当时自己很混乱,把这文件改了又改,都没搞清楚错在哪,总之突然就好了……
helloworld 成功后,又拿了个的简单web.py程序来做测试。没想到一来就提示找不到web模块,害得我还以为GAE不支持web.py。google后得知要把"/usr/local/lib/python2.5/site-packages/web" 这个目录复制到应用程序的根目录下去。问题果然解决。
但是程序依旧不能运行,报错:ImportError: No module named flup.server.fcgi,google后得知在GAE中要将app.run()改成app.cgirun()才能运行。
最后一个问题是关于template,这个之前在web.py的官方cookbook上就有看到。(见这里http://webpy.org/cookbook/templates_on_gae )。web.py的templetor需要把模板编译成pyc字节码,这需要访问标准库中的parser模块。然而GAE禁用了这个模块。因此必须对模板进行编译,方法是:
python web/template.py --compile templates.py
注意这里的web就是上面提到的复制过来的web,我最初没有意识到,以为web是应用程序所在的目录,于是遇到了一个“500 dude,This is whack”的错误,实在是让人啼笑皆非,还有compile前面是两个横杠。编译成功后放模板的templates文件夹下面会多一个__init__.py文件。以后一旦更改到模板,就必须重新编译。
解决以上问题之后,我GAE上的第一个web.py程序终于跑起来了……
继续努力,希望自己的第一个web.py应用尽早上线!