diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/Server/InvalidUsage/__init__.py | 16 | ||||
| -rw-r--r-- | lib/Server/__init__.py | 50 |
2 files changed, 66 insertions, 0 deletions
diff --git a/lib/Server/InvalidUsage/__init__.py b/lib/Server/InvalidUsage/__init__.py new file mode 100644 index 0000000..e5616d4 --- /dev/null +++ b/lib/Server/InvalidUsage/__init__.py @@ -0,0 +1,16 @@ +from flask import jsonify + +class InvalidUsage(Exception): + status_code = 400 + + def __init__(self, message, status_code=None, payload=None): + Exception.__init__(self) + self.message = message + if status_code is not None: + self.status_code = status_code + self.payload = payload + + def to_dict(self): + rv = dict(self.payload or ()) + rv['message'] = self.message + return rv diff --git a/lib/Server/__init__.py b/lib/Server/__init__.py new file mode 100644 index 0000000..c3688c2 --- /dev/null +++ b/lib/Server/__init__.py @@ -0,0 +1,50 @@ +from flask import Flask +from flask import abort, redirect, url_for +import sys, os +sys.path.append("./lib") +from Pb import * +from Server.InvalidUsage import InvalidUsage + +class Server(object): + def __init__(self): + self.app = Flask(__name__) + @self.app.route('/im/pb/<pb_classname>', methods=['POST']) + def pb(): + self._response_post(pb_classname, request) + + @self.app.errorhandler(InvalidUsage) + def handle_invalid_usage(error): + response = jsonify(error.to_dict()) + response.status_code = error.status_code + return response + + self._classname_aliases = { + 'generate' : 'PbGenerate', + 'imgrid' : 'PbGrid', + } + def _find_class_by_name(self, pb_classname): + pb_classname = self._classname_aliases.get(pb_classname, None) or pb_classname + try: + filter(lambda c: c.__name__ == pb_classname, Pb.__subclasses__())[0] + except IndexError: + raise InvalidUsage('No such api', status_code=410) + + def _response_post(self, pb_classname, request): + pb_class = self._find_class_by_name(pb_classname) + classnames = map(lambda c: c.__name__, Pb.__subclasses__()) + try: + im = pb_class(**(dict(request.forms))) + im.create(); + return im.file_json(); + #FIXME handle BadParamsError and PbError separately + except Exception as e: + sys.stderr.write("%s failure" % pb_class.__name__) + sys.stderr.write("params:\n") + for i in request.forms: + sys.stderr.write("{}:{}\n".format(i, request.forms[i])) + raise; + return json.dumps({ 'error' : 'Request could not be processed' }) + + def run(self): + self.app.run() + |
