使用 Eclipse 在 Google App Engine 上创建 mashup,第 3 部分: 使用 RESTful Web 服务

在本系列中,将了解如何开始使用 Google App Engine (GAE)。在 第 1 部分 中,了解了如何设置开发环境,以便可以开始创建运行在 GAE 上的应用程序。还了解了如何使用 Eclipse 简化应用程序的开发和调试。在 第 2 部分 中,通过添加一些 Ajax 特性增强了该应用程序。还了解了在部署到 GAE 后如何监视该应用程序。本文是第 3 部分,将通过为应用程序创建 RESTful Web 服务返回到生态系统,这样其他人就可以使用它创建自己的 mashup。

GAE 是创建 Web 应用程序的平台。使用它的最重要的先决条件是具备 Python 知识,因为要在 GAE 中使用 Python 作为编程语言(目前为 Python V2.5.2)。对于本系列,具备一些典型的 Web 开发技能将会有帮助(例如,HTML、JavaScript 和 CSS 知识)。要针对 App Engine 进行开发,需要下载 App Engine SDK(请参阅 参考资料)。在本系列中,还使用 Eclipse V3.3.2 以辅助 GAE 开发(请参阅 参考资料)。并且需要 PyDev 插件以将 Eclipse 转换为 Python IDE。





回页首


订阅

到目前为止,我们的应用程序 aggroGator 允许用户聚合(mash up)多项常见 Web 服务并创建这些服务的聚合提要。现在,为了让事情变得有趣一些,我们希望允许用户订阅其他用户的提要(其中每个用户的提要可能是提要本身的聚合)。例如,假定需要设置一个帐户以在 Twitter、last.fm 和 del.icio.us 中订阅自己的提要,这样其他朋友随后可以订阅 aggroGator 提要以查看这些服务中的所有活动。要处理这种情况,需要再一次重新审视数据模型。

建模

要启用订阅,需要允许一个用户(帐户)订阅其他帐户列表。我们可以采取的一种方法是向每个帐户中添加用户列表。每个用户将添加一个订阅。此操作的代码将类似清单 1。


清单 1. 带有 user 列表的 Account 模型
class Account(db.Model):
user = db.UserProperty(required=True)
subscriptions = db.ListProperty(Account)

这种方法有一些优点。检索帐户时,可以获得该帐户订阅的所有其他帐户。这是使用诸如 GAE 的 Bigtable 之类的非关系数据库的常见策略:把所有相关数据保存在一起并且无需担心标准化之类的事务。但是,这种方法有一个缺点。如果需要显示特定用户订阅了哪些人的提要该怎么办?这样做的惟一方法是检索所有 Account 模型,查看所有订阅,并查看给定用户是否位于列表中。另外,可以在每个 Account 模型中保存两张列表 — 一张用于 subscriptions,一张用于 subscribers。我们不会采取这种方法,而是使用更传统的多对多模型,如清单 2 所示。


清单 2. Subscribe 模型
class Subscribe(db.Model):
subscriber = db.ReferenceProperty(Account, required=True,
collection_name='subscriptions')
subscribee = db.ReferenceProperty(Account, required=True,
collection_name='subscribers')

正如您所见,这个模型类似于关系数据库中的连接表(join table)。只是因为 GAE 使用非关系数据库(Bigtable)并不意味着您不能利用与关系数据库结合使用的技术。现在数据模型已经就绪,让我们详细查看如何从最终用户的角度创建这些多对多关系。

订阅管理

我们的应用程序可以存储订阅,因此只需要一种方法能够让用户创建订阅。为此,需要为用户创建一个用于添加订阅的页面(参见清单 3)。


清单 3. 帐户页面
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/
xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>Aggrogator Accounts</title>
<link rel="stylesheet" href="/css/aggrogator.css" type="text/css" />
<script type="text/javascript" src="/js/prototype.js"></script>
<script type="text/javascript" src="/js/builder.js"></script>
<script type="text/javascript" src="/js/effects.js"></script>
<script type="text/javascript" src="/js/aggrogator.js"></script>
</head>
<body>

<img id="spinner" alt="spinner" src="/gfx/spinner.gif" style="display: none;
position: fixed;" />

<div id="logout">
{{ account.user.nickname }}
<a href="{{ logout_url }}">Logout</a>
</div>

<div class="clearboth"></div>

<ol>
{% for acc in all_accounts %}
<li>
<a href="" οnclick="subscribe('{{ acc.user.email }}'); return false;">
{{ acc.user.email }}</a>
</li>
{% endfor %}
</ol>

</body>
</html>

正如您所见,此页面只显示系统中的所有帐户。然后用户通过单击选择要订阅的帐户。您可以设想更复杂的界面。例如,如果存在大量用户,这样的界面将变得笨拙,因此基于搜索的系统将更好。或者使用一个系统,允许用户导入地址本或使用 OpenSocial 等应用程序中的 API 查找已经包含在应用程序中的现有朋友。以上模板需要一张用户列表,因此让我们快速查看为页面创建模型的控制器(参见清单 4)。


清单 4. 帐户页面控制器




本文转自IBM Developerworks中国

      请点击此处查看全文


 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值