diff options
| author | LV-426 <lv-426@taproot.org.il> | 2015-01-13 18:09:44 +0200 |
|---|---|---|
| committer | LV-426 <lv-426@taproot.org.il> | 2015-01-13 18:09:44 +0200 |
| commit | 1983d480c3f7d818926a38c3419aecc4b69a00fc (patch) | |
| tree | 595e475155fb4f54aaa43b1df6fd9af764def5e7 /src | |
| parent | 233d9de48df7e32701500177203b36c5b27c2a1e (diff) | |
wip: rz_req_handling.py
Diffstat (limited to 'src')
| -rw-r--r-- | src/server/rz_api.py | 30 | ||||
| -rw-r--r-- | src/server/rz_api_rest.py | 42 | ||||
| -rw-r--r-- | src/server/rz_req_handling.py | 42 |
3 files changed, 65 insertions, 49 deletions
diff --git a/src/server/rz_api.py b/src/server/rz_api.py index 2a2500bb..b3ac7ae1 100644 --- a/src/server/rz_api.py +++ b/src/server/rz_api.py @@ -22,26 +22,26 @@ import traceback import crypt_util import db_controller as dbc - +from db_op import DBO_add_node_set +from db_op import DBO_diff_commit__topo +from db_op import DBO_load_link_set +from db_op import DBO_match_node_id_set +from db_op import DBO_match_node_set_by_id_attribute +from db_op import DBO_rz_clone from model.graph import Topo_Diff from model.model import Link from rz_api_common import __sanitize_input from rz_api_common import sanitize_input__topo_diff -from rz_api_rest import __common_resp_handle +from rz_api_rest import common_resp_handle from rz_kernel import RZ_Kernel -from db_op import DBO_match_node_set_by_id_attribute -from db_op import DBO_match_node_id_set -from db_op import DBO_load_link_set -from db_op import DBO_rz_clone -from db_op import DBO_diff_commit__topo -from db_op import DBO_add_node_set +from rz_req_handling import make_json_response log = logging.getLogger('rhizi') db_ctl = None # injected: DB controller -def __common_exec(op, on_success=__common_resp_handle, on_error=__common_resp_handle): +def __common_exec(op, on_success=common_resp_handle, on_error=common_resp_handle): """ @param on_success: should return a Flask Response object @param on_error: should return a Flask Response object @@ -78,10 +78,10 @@ def __load_node_set_by_id_attr_common(id_set): op = DBO_match_node_set_by_id_attribute(id_set=id_set) try: n_set = db_ctl.exec_op(op) - return __common_resp_handle(data=n_set) + return common_resp_handle(data=n_set) except Exception as e: log.exception(e) - return __common_resp_handle(error='unable to load node with ids: {0}'.format(id_set)) + return common_resp_handle(error='unable to load node with ids: {0}'.format(id_set)) def match_node_set_by_attr_filter_map(attr_filter_map): """ @@ -117,7 +117,7 @@ def rz_clone(): def on_success(topo_diff): # serialize Topo_Diff before including in response topo_diff_json = topo_diff.to_json_dict() - return __common_resp_handle(topo_diff_json) + return common_resp_handle(topo_diff_json) op = DBO_rz_clone() return __common_exec(op, on_success=on_success) @@ -180,18 +180,18 @@ def login(): u, p = sanitize_input(request) except: log.warn('failed to sanitize inputs. request: %s' % request) - return render_template('login.html', login_failed=True) + return make_json_response(status=401) # return empty response try: crypt_util.validate_login(flask.current_app.rz_config, u, p) except Exception as e: # login failed log.warn('login: unauthorized: user: %s' % (u)) - return render_template('login.html', login_failed=True) + return make_json_response(status=401) # return empty response # login successful session['username'] = u log.debug('login: success: user: %s' % (u)) - return '{}'; + return make_json_response(status=200) # return empty response if request.method == 'GET': return render_template('login.html') diff --git a/src/server/rz_api_rest.py b/src/server/rz_api_rest.py index bad0cfa7..03a83f3a 100644 --- a/src/server/rz_api_rest.py +++ b/src/server/rz_api_rest.py @@ -23,39 +23,13 @@ from model.graph import Topo_Diff from rz_api_common import sanitize_input__attr_diff from rz_api_common import sanitize_input__topo_diff from rz_api_common import validate_obj__attr_diff +from rz_req_handling import common_resp_handle log = logging.getLogger('rhizi') db_ctl = None # injected: DB controller -def __response_wrap(data=None, error=None): - """ - wrap response data/errors as dict - this should always be used when returning - data to allow easy return of list objects, assist in error case distinction, etc. - """ - return dict(data=data, error=error) - -def __common_resp_handle(data=None, error=None): - """ - provide common response handling - - @data must be json serializable - @error will be serialized with str() - """ - if error is None: - error_str = "" - else: - error_str = str(error) # convert any Exception objects to serializable form - ret_data = __response_wrap(data, error_str) - resp = jsonify(ret_data) # this will create a Flask Response object - - resp.headers['Access-Control-Allow-Origin'] = '*' - - # more response processing - - return resp - def diff_commit__topo(): """ REST API wrapper around diff_commit__topo(): @@ -72,16 +46,16 @@ def diff_commit__topo(): try: topo_diff = sanitize_input(request) except Exception as e: - return __common_resp_handle(error='malformed input') + return common_resp_handle(error='malformed input') try: kernel = flask.current_app.kernel _, commit_ret = kernel.diff_commit__topo(topo_diff) - return __common_resp_handle(data=commit_ret) + return common_resp_handle(data=commit_ret) except Exception as e: log.error(e.message) log.error(traceback.print_exc()) - return __common_resp_handle(error=e) + return common_resp_handle(error=e) def diff_commit__attr(): """ @@ -96,22 +70,22 @@ def diff_commit__attr(): def on_error(e): # handle DB ERRORS, eg. name attr change error - return __common_resp_handle(error='error occurred') + return common_resp_handle(error='error occurred') try: attr_diff = sanitize_input(request) validate_obj__attr_diff(attr_diff) except Exception as e: - return __common_resp_handle(error='malformed input') + return common_resp_handle(error='malformed input') try: kernel = flask.current_app.kernel _, commit_ret = kernel.diff_commit__attr(attr_diff) - return __common_resp_handle(data=commit_ret) + return common_resp_handle(data=commit_ret) except Exception as e: log.error(e.message) log.error(traceback.print_exc()) - return __common_resp_handle(error=e) + return common_resp_handle(error=e) def diff_commit__vis(): pass diff --git a/src/server/rz_req_handling.py b/src/server/rz_req_handling.py new file mode 100644 index 00000000..f0999e3e --- /dev/null +++ b/src/server/rz_req_handling.py @@ -0,0 +1,42 @@ +from flask import jsonify +from flask import make_response + +def make_json_response(status=200, data='{}'): + """ + Construct a json response with proper content-type header + """ + resp = make_response(data) + resp.headers['Content-Type'] = "application/json" + resp.status = status + return resp + +def common_resp_handle(data=None, error=None): + """ + common response handling: + - add common response headers + - serialize response + + @data must be json serializable + @error will be serialized with str() + """ + + def __response_wrap(data=None, error=None): + """ + wrap response data/errors as dict - this should always be used when returning + data to allow easy return of list objects, assist in error case distinction, etc. + """ + return dict(data=data, error=error) + + if error is None: + error_str = "" + else: + error_str = str(error) # convert any Exception objects to serializable form + + ret_data = __response_wrap(data, error_str) + resp = jsonify(ret_data) # this will create a Flask Response object + + resp.headers['Access-Control-Allow-Origin'] = '*' + + # more response processing + + return resp |
