使用示例:
#author:pickerel@gmail.com
import wsgiref.handlers
from google.appengine.ext import webapp
from rest import *
class CommentResource(RestResource):
def initialize(self):
self.response.out.write("comment.initialize:format=%s<br/>" %(self.format))
def index(self, entry_id):
self.response.out.write("comment.index:entry_id=%s<br/>" % entry_id)
def show(self, id, entry_id):
self.response.out.write("comment.show:id=%s,entry_id=%s<br/>" %(id, entry_id))
def create(self, entry_id):
self.response.out.write("comment.show:id=%s,entry_id=%s<br/>" %(id, entry_id))
def update(self, id, entry_id):
self.response.out.write("comment.update:id=%s,entry_id=%s<br/>" %(id, entry_id))
def delete(self, id, entry_id):
self.response.out.write("comment.delete:id=%s,entry_id=%s<br/>" %(id, entry_id))
class EntryResource(RestResource):
def initialize(self):
self.response.out.write("entry.initialize:format=%s<br/>" %(self.format))
def index(self):
self.response.out.write("entry.index<br/>")
def show(self, id):
self.response.out.write("entry.show:id=%s<br/>" %(id))
def create(self):
self.response.out.write("entry.show:id=%s<br/>" %(id))
def update(self, id):
self.response.out.write("entry.update:id=%s<br/>" %(id))
def delete(self, id):
self.response.out.write("entry.delete:id=%s<br/>" %(id))
""""""
def main():
RestHandler.route = {
'/entries' : EntryResource,
'/entries/:entry_id/comments' : CommentResource}
application = webapp.WSGIApplication([(".*", RestHandler)], debug=True)
wsgiref.handlers.CGIHandler().run(application)
if __name__ == '__main__':
main()
在这个rest实现机制中,资源支持的操作有5种,index,show,create,update,delete。
请求会根据请求的http method和路由设定自动和资源绑定。
比如
'/entries/:entry_id/comments' : CommentResource
这个路由说明 /entries/:entry_id/comments 这个模式的url将绑定到CommentResource上,
其中:entry_id是一个参数。
配置这个路由后,访问
/entries/2/comments 将调用CommentResource的index(self, entry_id)方法,里面的entry_id与路由配置的:entry_id是对应的,这里entry_id=2
同样
/entries/2/comments/1 将调用CommentResource的show(self, id, entry_id)方法,调用时候id=1,entry_id=2
该实现还支持不同的内容格式请求的区分,
/entries/2/comments/1
/entries/2/comments/1.html
/entries/2/comments/1.xml
这三个请求都将调用CommentResource的show(self, id, entry_id)方法,在这个方法中,可以通过self.format来获取用户所请求的格式,上面三个请求的内容格式分别为 html, html, xml
文件rest.py,实现url的解析及和资源的绑定
#author:pickerel@gmail.com
import wsgiref.handlers
from google.appengine.ext import webapp
_DEFAUT_RESOURCE_FORMAT = 'html'
class RestResource:
def __init__(self, request, response, params = {}, value = None, format = _DEFAUT_RESOURCE_FORMAT):
self.request = request
self.response = response
self.params = params
self.value = value
self.format = format
def initialize(self):
""""""
def index(self, *args):
""""""
def show(self, res, *args):
""""""
def create(self, *args):
""""""
def update(self, res, *args):
""""""
def delete(self, res, *args):
""""""
class RestHandler(webapp.RequestHandler):
route = {}
#{
# '/':IndexResource,
# '/entries' : EntryResource,
# '/entries/:entry_id/comments' : CommentResource}
def __init__(self):
self.resource = None
def initialize(self, request, response):
webapp.RequestHandler.initialize(self, request, response)
if self.request.path == '' or self.request.path == '/':
self.resource = RestHandler.route['/'](request, response)
else:
self.resource = RestHandler.get_rest_resource(request, response)
if self.resource != None:
self.resource.initialize()
else:
self.error(404)
@staticmethod
def get_rest_resource(request, response):
path_fields = request.path[1:].split("/")
resource = None
resource_paramters = {}
resource_value = None
resource_format = _DEFAUT_RESOURCE_FORMAT
for item in RestHandler.route.items():
resource = None
resource_value = None
resource_paramters.clear()
resource_format = _DEFAUT_RESOURCE_FORMAT
route_path = item[0][1:]
route_path_fields = route_path.split("/")
if len(route_path_fields) == len(path_fields) or len(route_path_fields) + 1 == len(path_fields):
resource = item[1]
for i in range(len(path_fields)):
if i == len(path_fields) - 1 and path_fields[i].find(".") != -1:
arr = path_fields[i].split('.')
path_fields[i] = arr[0]
resource_format = arr[1]
if i == len(route_path_fields):
resource_value = path_fields[i]
elif path_fields[i] == route_path_fields[i]:
continue
elif route_path_fields[i].startswith(":"):
resource_paramters[route_path_fields[i][1:]] = path_fields[i]
else:
resource = None
break
if resource != None:
break;
if resource == None:
return None
else:
return resource(request, response, resource_paramters, resource_value, resource_format)
def get(self):
if self.resource != None:
if self.resource.value != None:
self.resource.show(self.resource.value, **self.resource.params)
else:
self.resource.index( **self.resource.params)
def post(self):
"""Handler method for POST requests."""
if self.resource != None:
if self.resource.value != None:
self.resource.create( **self.resource.params)
else:
self.error(404)
def put(self):
if self.resource != None:
if self.resource.value != None:
self.resource.update(self.resource.vaue, **self.resource.params)
else:
self.error(404)
def delete(self):
if self.resource != None:
if self.resource.value != None:
self.resource.delete(self.resource.vaue, **self.resource.params)
else:
self.error(404)
完整代码见附件
分享到:
相关推荐
Google App Engine 是一个由 Google 提供的平台,用于构建和托管 web 应用程序。它是一种基于云的服务,允许开发者使用 Python、Java、Go 或 PHP 等语言编写应用程序,并在 Google 的基础设施上运行,无需考虑服务器...
### 编程Google App Engine —— Dan Sanderson #### 标题解读 - **Programming Google App Engine**:这本书主要介绍了如何使用Google App Engine(GAE)进行应用开发。Google App Engine是Google提供的一种云平台...
用于 Google App Engine 的 Python Flask Restful API 骨架使用在 Google App Engine 上构建 Python 应用程序的。测试API $ curl http://127.0.0.1:8080/> Hello World!$ curl ...
在Google App Engine上开发Flex应用是一项技术性强且富有挑战性的任务,它涉及到多个技术栈的融合,包括前端的Flex框架、后端的Google App Engine(GAE)平台以及两者之间的通信机制。这篇博客的文章作者提供了名为`...
他们的 其中一项主要工作是为读写App Engine Datastore数据的项目以及使用谷歌账户储存用户信息的项目编写服务器端代码,为了使这一过程更容易,才创建了Tailbone作为 Datastore的RESTful API。 via iteye ...
【标题】"appengine-guestbook-python-part1-helloworld.zip_GuestBook" 指的是一款基于Google App Engine平台开发的Python GuestBook应用的第一部分,主要用于实现一个简单的在线留言簿功能。Google App Engine是一...
**谷歌浏览器RESTful请求插件** 谷歌浏览器RESTful请求插件是开发人员在进行Web API测试、调试和接口文档编写时的重要工具。它允许用户直接在浏览器中发起HTTP请求,包括GET、POST、PUT、DELETE等RESTful操作,极大...
总结起来,"appengine-jersey-jackson-jdo"项目是一个基于Google App Engine的RESTful API服务,利用Jersey提供REST服务,Jackson处理JSON序列化和反序列化,JDO则负责数据的持久化操作。这个项目提供了一种结构化的...
gae-init是使用Python,Flask,RESTful,Bootstrap和大量其他炫酷功能在Google App Engine上启动新应用程序的最简单的样板。 阅读,您可以在其中找到完整的,详细的,操作等。 始终可以从访问最新版本。 要求 ,...
Flask-Ember-GAE 是一个简单的 Web 应用程序,它是使用 Google App Engine 上的 Flask Python 库作为 Ember.js 应用程序的 RESTful 后端的脚手架。 ##使用: ###安装应用引擎 下载并安装 这将为您提供一个模拟...
在本压缩包中,"cloudservice-master"是一个项目源代码目录,表明这是一份关于CloudBaaS的服务器端程序,特别依赖于新浪App Engine这一特定的云平台。 新浪App Engine是新浪公司提供的一个云计算平台,允许开发者...
在本文中,我们将深入探讨如何在Google App Engine (GAE)平台上使用Java Servlet来构建一个简单的RESTful服务。Google App Engine是一个云托管平台,允许开发者使用Java、Python、Go等语言构建并运行web应用程序。...
【Epsilon Live:一个基于Google AppEngine的JavaScript应用程序】 Epsilon Live是一款专为Google AppEngine平台构建的应用程序,它利用了Google提供的云服务来运行和托管动态网站和Web应用程序。这款应用的核心...
Spring Security Third Edition Secure your web applications, RESTful services, and microservice architectures
标题中的“谷歌浏览器发送RESTful请求插件”指的是在Google Chrome浏览器中使用的扩展程序,用于方便地发送RESTful API请求。REST(Representational State Transfer)是一种网络应用程序的设计风格和开发方式,基于...
【标题】"LoJackMyKids_GAE:用于 Lo Jack My Kids 的 Google App Engine" 是一个基于Google App Engine的项目,其主要目标是为家长提供一种追踪和保护孩子安全的工具。这个项目可能涉及到一系列的IT知识点,特别是与...
用于 Google App Engine 的 Python Flask 骨架 使用在 Google App Engine 上构建 Python 应用程序的。 有关示例应用程序和其他 Python 框架和用例的脚手架,请参阅我们的其他。 在本地运行 安装 。 有关说明,请...