diff options
| -rw-r--r-- | lib/Server/InvalidUsage/__init__.py | 16 | ||||
| -rw-r--r-- | lib/Server/__init__.py | 50 | ||||
| -rw-r--r-- | run_server.py | 6 | ||||
| -rwxr-xr-x | share/Flask_test/pbserver.py | 47 |
4 files changed, 72 insertions, 47 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() + diff --git a/run_server.py b/run_server.py new file mode 100644 index 0000000..2596024 --- /dev/null +++ b/run_server.py @@ -0,0 +1,6 @@ +#!/usr/bin/python2 +import sys +sys.path.append("./lib") +from Server import Server +server = Server() +server.run() diff --git a/share/Flask_test/pbserver.py b/share/Flask_test/pbserver.py index 3d0caa8..400883a 100755 --- a/share/Flask_test/pbserver.py +++ b/share/Flask_test/pbserver.py @@ -1,50 +1,4 @@ #!/usr/bin/python2.7 -from bottle import route, run, post, request, static_file -sys.path.append("./lib") -from Pb import * -import sys, os - -from subprocess import call, Popen, PIPE - -#FIXME add -def return_jsonp(im, insert_url="NULL"): - return "{}({})".format(im.get("callback"), format_im_data(im, insert_url)) - -def _pb_post(pb_class, request): - try: - im = pb_class(**(dict(request.forms))) - im.create(); - return im.file_json(); - 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' }) - -@post('/im/api/imgradient') -def gradient(): - _pb_post(PbGradient, request) - -@post('/im/api/imgrid') -def imgrid(): - _pb_post(PbLandscape, request) - -@post('/im/api/generate') -def generate(): - _pb_post(PbGenerate, request) - -@post('/im/api/imbreak') - _pb_post(PbBreak, request) - -@post('/im/api/impattern') -def pattern(): - _pb_post(PbPattern, request) - -@post('/im/api/imlandscape') -def imlandscape(): - _pb_post(Imlandscape, request) #static routes #{{{ @@ -83,5 +37,4 @@ def server_static(filename): return static_file(filename, root='frontend/img/') #}}} -run(host='0.0.0.0', server='flup', port=8999, debug=True) #run(host='0.0.0.0', port=8999, debug=True) |
