`

Restful your google app engine applications

阅读更多
使用示例:
#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_appengine_1.9.38

    Google App Engine 是一个由 Google 提供的平台,用于构建和托管 web 应用程序。它是一种基于云的服务,允许开发者使用 Python、Java、Go 或 PHP 等语言编写应用程序,并在 Google 的基础设施上运行,无需考虑服务器...

    Programming Google App Engine - Dan Sanderson

    ### 编程Google App Engine —— Dan Sanderson #### 标题解读 - **Programming Google App Engine**:这本书主要介绍了如何使用Google App Engine(GAE)进行应用开发。Google App Engine是Google提供的一种云平台...

    flask-restful-api-appengine:用于 Google App Engine 的带有烧瓶的宁静 API

    用于 Google App Engine 的 Python Flask Restful API 骨架使用在 Google App Engine 上构建 Python 应用程序的。测试API $ curl http://127.0.0.1:8080/&gt; Hello World!$ curl ...

    在Google App Engine上开发Flex应用(含简单示例源码)

    在Google App Engine上开发Flex应用是一项技术性强且富有挑战性的任务,它涉及到多个技术栈的融合,包括前端的Flex框架、后端的Google App Engine(GAE)平台以及两者之间的通信机制。这篇博客的文章作者提供了名为`...

    使用JS读写AppEngine数据Tailbone.zip

    他们的 其中一项主要工作是为读写App Engine Datastore数据的项目以及使用谷歌账户储存用户信息的项目编写服务器端代码,为了使这一过程更容易,才创建了Tailbone作为 Datastore的RESTful API。 via iteye ...

    appengine-guestbook-python-part1-helloworld.zip_GuestBook

    【标题】"appengine-guestbook-python-part1-helloworld.zip_GuestBook" 指的是一款基于Google App Engine平台开发的Python GuestBook应用的第一部分,主要用于实现一个简单的在线留言簿功能。Google App Engine是一...

    谷歌浏览器restful请求插件

    **谷歌浏览器RESTful请求插件** 谷歌浏览器RESTful请求插件是开发人员在进行Web API测试、调试和接口文档编写时的重要工具。它允许用户直接在浏览器中发起HTTP请求,包括GET、POST、PUT、DELETE等RESTful操作,极大...

    appengine-jersey-jackson-jdo:带有Jersey,Jackson和JDO依赖关系的Google App Engine Maven项目

    总结起来,"appengine-jersey-jackson-jdo"项目是一个基于Google App Engine的RESTful API服务,利用Jersey提供REST服务,Jackson处理JSON序列化和反序列化,JDO则负责数据的持久化操作。这个项目提供了一种结构化的...

    gae-init:基于Python,Flask,RESTful,Bootstrap和大量其他出色功能的Google App Engine

    gae-init是使用Python,Flask,RESTful,Bootstrap和大量其他炫酷功能在Google App Engine上启动新应用程序的最简单的样板。 阅读,您可以在其中找到完整的,详细的,操作等。 始终可以从访问最新版本。 要求 ,...

    Flask-Ember-GAE:用于 Ember 应用程序的 App Engine RESTful 后端

    Flask-Ember-GAE 是一个简单的 Web 应用程序,它是使用 Google App Engine 上的 Flask Python 库作为 Ember.js 应用程序的 RESTful 后端的脚手架。 ##使用: ###安装应用引擎 下载并安装 这将为您提供一个模拟...

    CloudBaaS的Server端程序,即移动应用后端程序(依赖于Sina App Engine).zip

    在本压缩包中,"cloudservice-master"是一个项目源代码目录,表明这是一份关于CloudBaaS的服务器端程序,特别依赖于新浪App Engine这一特定的云平台。 新浪App Engine是新浪公司提供的一个云计算平台,允许开发者...

    GoogleAppEngineServlet:Google App Engine 上的简单 Java Servlet

    在本文中,我们将深入探讨如何在Google App Engine (GAE)平台上使用Java Servlet来构建一个简单的RESTful服务。Google App Engine是一个云托管平台,允许开发者使用Java、Python、Go等语言构建并运行web应用程序。...

    epsilon-live:Epsilon Google AppEngine应用程序

    【Epsilon Live:一个基于Google AppEngine的JavaScript应用程序】 Epsilon Live是一款专为Google AppEngine平台构建的应用程序,它利用了Google提供的云服务来运行和托管动态网站和Web应用程序。这款应用的核心...

    Spring Security Secure your web applications

    Spring Security Third Edition Secure your web applications, RESTful services, and microservice architectures

    谷歌浏览器 发送restful 请求插件

    标题中的“谷歌浏览器发送RESTful请求插件”指的是在Google Chrome浏览器中使用的扩展程序,用于方便地发送RESTful API请求。REST(Representational State Transfer)是一种网络应用程序的设计风格和开发方式,基于...

    LoJackMyKids_GAE:用于 Lo Jack My Kids 的 Google App Engine

    【标题】"LoJackMyKids_GAE:用于 Lo Jack My Kids 的 Google App Engine" 是一个基于Google App Engine的项目,其主要目标是为家长提供一种追踪和保护孩子安全的工具。这个项目可能涉及到一系列的IT知识点,特别是与...

    App-Engine-Flask-Restful-Example

    用于 Google App Engine 的 Python Flask 骨架 使用在 Google App Engine 上构建 Python 应用程序的。 有关示例应用程序和其他 Python 框架和用例的脚手架,请参阅我们的其他。 在本地运行 安装 。 有关说明,请...

Global site tag (gtag.js) - Google Analytics