这个周末玩了玩Google App Engine,随手写点东西,算是学习笔记吧。不当之处,请多多指正。

作者:liigo,2009/04/26夜,大连

原创链接:http://blog.csdn.net/liigo/archive/2009/04/26/4127055.aspx

转载请注明出处:http://blog.csdn.net/liigo

一,怎么想起来玩Google App Engine了呢?

近期想写一个小程序,以便在公司的电脑和家里的电脑之间随时共享数据。但是没有现成的server和虚拟主机,数据存在哪里就成了问题。为了这个小东西去专门租一个虚拟主机吗,似乎不值得。而Google App Engine (GAE)同意用户在GOOGLE的server上免费部署WEB应用程序,自然而然的满足了我的需求。

二,什么是Google App Engine?

严格的定义去官方站点(http://code.google.com/intl/en/appengine/)找吧,我(liigo)通俗的理解为,它是一个相似虚拟主机的东西,同意你把写好的WEB应用程序(WEB站点),部署在它的server上。举个样例吧,如今网络上到处都有提供“PHP + MySQL”和“ASP + SQLServer”虚拟主机服务的吧,一般每年收费从几百元到成千上万元的都有;而Google App Engine则相当于给你免费提供“Python + Datastore”和“Java Servlet/JSP + Datastore”虚拟主机服务(Datastore是GOOGLE提供的数据库,The App Engine datastore is a schemaless object datastore, with a query engine and atomic transactions.)。我们的程序跑在GOOGLE的server上,使用GOOGLE的CPU和带宽,享受GOOGLE优秀网络架构下的安全性、灵活性、可伸缩性和负载均衡。Google App Engine为每一个程序免费提供500M存储空间,充足的CPU(每日最高46CPU-hours)和带宽(每日最高上传下载流量各10G),以及每月500万点击量,足够应付大多数项目需求(必要时还能够付费扩展);而提供等值性能的普通虚拟主机,则价格不菲。眼下Google App Engine仅仅支持Python和Java,计划中将支持其他编程语言(PHP, Ruby, Perl, ASP, ESP?)。我(liigo)个人以为,Google App Engine前途不可限量,将逐步蚕食眼下的虚拟主机(virtual hosts)市场。眼下它的劣势是,仅仅支持Python和Java,而这两者显然不是WEB开发的首选。

三,Python,还是Java?

Google App Engine眼下仅仅支持Python和Java,这是个二选一的问题。从对编程语言的了解上,我应该选Java,可是考虑到开发的高速和便捷,我终于还是选择了我不怎么熟悉(甚至一度排斥)的Python。拿Java写WEB,就象拿易语言写server一样,未必是最好的选择。

四,Google App Engine之旅

照着新手教程一步步的来,刚開始进展顺利,非常快就成功的部署了第一个程序,开心啊。

四.1 app.yaml *.py 等文件都能够即时改动即时生效,不用重新启动WEBserver,非常好。

四.2 库路径,好累啊。在接触到WebApp(以及后来的webob, cgi)时卡住了,报告“ImportError”错误,似乎是找不到对应的Python库(哈哈,我还以为仅仅有易语言会提示“无法载入支持库”呢),搜索了半天,总算通过设置系统环境变量PYTHONPATH攻克了,其值为:

D:/Python25/Lib;D:/Program Files/Google/google_appengine;D:/Program Files/Google/google_appengine/lib/webob

我以为这是Google App Engine Python SDK安装包的疏忽,没有正确的设置相关库路径,害刚開始学习的人们卡壳了半天。要说Java的classpath刚開始学习的人难以理解,Python的PYTHONPATH, sys.path也好不哪里去,还别说,EF不是照样引入了EF_LIB_PATHS嘛。说多了。

四.3 不能在类定义之前使用它。WebApp最核心的一句代码:

application = webapp.WSGIApplication([('/index', MainPage)], debug=True)

我特意试了一下,把类MainPage的定义移到这一行以下,天啊,出来满屏的错误,吓得我又改回去了。可见尽管是脚本语言,也不能随着性子来。可是我真的希望把这一行写在源文件的最前面,由于这里集中了整个程序的结构。

四.4 URL中的字母是区分大写和小写的。比如:http://localhost:8080/index 写成 .../Index 就不行了,这一点不太好,应该改正。

四.5 Python格式化文本的语法,又卡住我半天。例程里有这么一句 write("%s" % a),我想再加一个"%s",尝试了各种语法,write("%s%s" % a % b),write("%s%s", a,b) 等等,深受折磨,偏偏Google也来折磨我,不同意我搜索"python %s"keyword,后来通过搜索"python format string"才找到正确答案:write("%s%s" %(a,b))。呵呵,探索的快乐。

四.6 文本转整数,用 int() 函数。依据某个id删除一个贴子,首先得到的是id的文本形式(self.request.get('id')),要先转成整数后再去数据库查找相应的记录(db.Model.get_by_id())。对python语言不熟啊,要搜索半天才找到int()这个函数。C/C++的话,我知道用atoi();Java的话,我知道用Integer.parseInt();Delphi的话,我知道用strtoint();易语言的话,我知道用"到整数()";EF的话,我知道用"文本类.到整数()";可是python的话,我要搜索半天才干找到int()。

四.7 Google的数据库Datastore。它不是传统的关系型数据库,而是对象型数据库;它不支持标准的SQL,但有相似的GQL。在python里使用的话:要先定义一个继承自db.Model的类(MyModel),指定各成员属性,相当于定义表结构(字段及其类型)吧;查询时,通过 db.GqlQuery() 构造一个GqlQuery对象(可当作MyModel对象的集合使用,如 for ... in,GQL中"select from xxx"里的"xxx",就是MyModel类的类名称"MyModel"),或通过调用类方法MyModel.gql()返回GqlQuery对象(此时GQL中不须要"select from xxx"部分了);插入时,先实例化出一个MyModel对象,对其各成员赋值,然后调用该对象的put();改动时,对MyModel对象指定成员赋值,再调用put();删除时,调用MyModel类静态方法get_by_id()或get_by_key_name(),返回一个MyModel对象,调用该对象的delete()就可以。

四.8 Django的HTML模板。演示样例中有 {% if a %}的写法,我照猫画虎,写出来的 {% if a = b %} 被报告有语法错误,查了django模板文档才知道要写成 {% ifequal a b %},不直观啊,害我猜错了。另外,感觉这个模板系统思路有问题,HTML中充斥着{%%},一塌糊涂,既不成HTML也不成Python,生产力不高(但总比在Python代码中到处嵌HTML好一些);应该借鉴Tapestry的模板思路,对HTML有最小的侵入性,让标准的HTML编辑工具(DreamWeaver)仍然能够正常工作,否则美工MM是不喜欢參予你的项目的,她非常难跟你合作。Tapestry的模板系统,是我接触到的最好的思路正确的模板系统,将来易语言的ESP(Easy Server Pages)或许会引入相似的模板。

四.9 把输出编码设定为UTF-8,就能够非常自然地显示中文了:handler.response.headers['Content-Type'] = 'text/html; charset=utf-8'

五,学习和实践的成果

这两天的成果是:走完了新手教程的整个流程,形成网站http://liigotemp.appspot.com/;写了一个简单的小程序,形成网站http://liigoshared.appspot.com/(临时没有编辑功能)。

Google App Engine 学习和实践的更多相关文章

  1. 使用Google App Engine开始新的网站开发学习

    继长时间的迷茫后,我发现还是回归php网站开发更适合我,或者没有那么深刻,但至少要做点事情.不知道以后将从事什么样的工作,但现在找点事情做还是很好的.所以,为了激发我学习的热情,我在网上搜了一下免费云 ...

  2. Google App Engine, Python2.7的UnicodeDecodeError bug

    在跟Web Development,要在Google App Engine上写作业,出师不利,遇到以下bug: 2014-05-06 16:14:17 Running command: "[ ...

  3. [Ubuntu] Linux下使用google app engine,无法打开https网站的解决方法

    为什么这里写的是 google app engine?原因我就不解释了.步骤如下: 1)安装证书导入工具:$ sudo apt-get install libnss3-tools 2)导入CA.crt ...

  4. 介绍Google App Engine

    Google App Engine是一个网络应用托管服务(web application hosting service).所谓网络应用(By web application),我们的意思的可以通过网 ...

  5. Google App Engine Deployment 相关问题

    1.GAE instance上传成功之后可以正常运行的情况下.在Google账户中“关联的应用和网站”,撤销Google App Engine appcfg对Google账户的访问权限. 再次上传时, ...

  6. 如何架设部署V2EX社区/论坛(Google App Engine版)

    1.What's V2EX? 关于这个问题,我们可以看看其作者Livid早期自己的V2EX社区的介绍: What's V2EX? 这是很多人都问过的问题,而我一直都没有做出一个明确的解答.因为我实在觉 ...

  7. PaaS平台– Google App Engine的开源实现AppScale环境搭建

    搭建好开发环境介绍: 硬件平台:HP Z800 工作站  内存:24GB      硬盘:1TB 虚拟化环境:XenServer 6.2.0 VM1:Ubuntu 12.04 amd64 server ...

  8. 给Eclipse安装Google app engine插件

    1.一般的做法: 参考:https://developers.google.com/eclipse/docs/install-eclipse-4.3 2. 因为 上面的做法一直没有成功,改为下载离线包 ...

  9. Google Earth Engine学习资源分享

    最近在学习Google Earth Engine的使用,发现这个平台确实是一个非常好用.非常强大的平台.在GEE官网上找到了一些中文的学习资料,现在搬运过来分享给大家共同学习.教程分为两个部分 教程一 ...

随机推荐

  1. G - I Think I Need a Houseboat(简单题,粘贴下来是因为数据精度需要注意)

    These will be floating point numbers:看这句话,就是说数据会是浮点型的, 问题(一)数据定义成double类型就过了 我当时以为定义成float类型就可以了, 因为 ...

  2. CUDA纹理绑定

    纹理绑定的一般步骤: size_t fea_pitch; texture<unsigned char, 2> features2D; cudaMallocPitch((void**)(&a ...

  3. (Problem 5)Smallest multiple

    2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any rema ...

  4. xadmin集成ueditor

    from DjangoUeditor.models import UEditorField content = UEditorField(u"内容", imagePath=&quo ...

  5. vs2010断点使用技巧

    msdn:http://msdn.microsoft.com/zh-cn/library/vstudio/5557y8b4.aspx 有很多断点的文章. 为提供更大的灵活性,Visual Studio ...

  6. methanol 模块化的可定制的网页爬虫软件,主要的优点是速度快。

    methanol模块化的可定制的网页爬虫软件,主要的优点是速度快. 下载:http://sourceforge.net/projects/methabot/?source=typ_redirect R ...

  7. 使用 stvd 编译STM8S 时能看到使用RAM ROM大小的方法

    刚刚安装的STVD编译器,编译时候不显示用了多少RAM和ROM?对于此问题.有两个方法:一是看.map文件 还有一种是 添加一个补丁,详细操作例如以下,能够在我的资源里下载对应的文件. http:// ...

  8. 【模式识别】SVM核函数

    下面是几种经常使用的核函数表示: 线性核(Linear Kernel) 多项式核(Polynomial Kernel) 径向基核函数(Radial Basis Function) 也叫高斯核(Gaus ...

  9. Intent数据传递

    (1)首先是Activity的简单跳转: 1).Activity的切换一般是通过Intent来实现的,Intent是一个Activity到达另一个Activity的引路者,它描述了起点(当前Activ ...

  10. django-template-loader

    当在settings.py中设置了如下 TEMPLATE_LOADERS=( 'django.template.loaders.filesystem.Loader', 'django.template ...