Created
December 16, 2009 01:29
-
-
Save gerad/257495 to your computer and use it in GitHub Desktop.
turn google app engine to a big json db in the cloud
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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