Skip to content

Instantly share code, notes, and snippets.

@pansapiens
Forked from gerad/gae_json_rest.py
Created January 27, 2010 11:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pansapiens/287756 to your computer and use it in GitHub Desktop.
Save pansapiens/287756 to your computer and use it in GitHub Desktop.
turn google app engine to a big json db in the cloud
from google.appengine.ext import webapp
from google.appengine.ext.webapp import util
from django.utils import simplejson as json
from google.appengine.ext import db
import re
import pdb, sys
debugger = pdb.Pdb(stdin=sys.__stdin__, stdout=sys.__stdout__)
class MainHandler(webapp.RequestHandler):
def get(self):
name, key = self.name_and_key(self.request.path)
model = self.model(name)
if key:
self.send_json(self.entity_dict(model.get_by_id(key)))
elif name:
self.send_json([self.entity_dict(e) for e in model.all()])
else:
self.send_json([name, key])
def put(self):
self.response.out.write('TODO')
def post(self):
name, key = self.name_and_key(self.request.path)
model = self.model(name)
entity = self.create_entity(model, self.request.body)
self.send_json(self.entity_dict(entity))
def delete(self):
name, key = self.name_and_key(self.request.path)
model = self.model(name)
entity = model.get_by_id(key)
ret = self.entity_dict(entity)
del ret['id']
entity.delete()
self.send_json(ret)
##
def send_json(self, data):
self.response.content_type = 'application/json'
json.dump(data, self.response.out)
def create_entity(self, model, json_string):
attrs = self.parse_json(json_string)
entity = model(**attrs)
entity.put()
return entity
def entity_dict(self, entity):
ret = dict()
for k in entity.dynamic_properties():
ret[k] = getattr(entity, k)
ret['id'] = entity.key().id()
return ret
def parse_json(self, json_string):
return self.str_keys(json.loads(json_string))
def str_keys(self, hash):
ret = dict()
for k, v in hash.items():
ret[str(k)] = v
return ret
def name_and_key(self, path):
m = re.match(r'^/(\w+)/?(\d+)?$', path)
if m: return m.groups()[0], int(m.groups()[1])
else: return None, None
def model(self, name):
return type(name, (db.Expando,), {})
def main():
application = webapp.WSGIApplication([(r'/.*', MainHandler)],
debug=True)
util.run_wsgi_app(application)
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment