Source code for bibliopixel.control.rest.rest_server

import contextlib, flask, pathlib, traceback, urllib
from . import flask_server, decorator
from ... util import data_file


[docs]class RestServer: def __init__(self, port, external_access, open_page, root_folder, index_file): root_folder = pathlib.Path(root_folder) static_folder = str(root_folder / 'static') index_file = pathlib.Path(index_file) if not index_file.is_absolute(): index_file = root_folder / index_file self.index_file = str(index_file) self.project = None self.port = port self.flask_server = flask_server.FlaskServer( port, external_access, open_page, static_folder=static_folder) route = self.flask_server.app.route route('/get/<address>', methods=['GET'])(self.get) route('/set/<address>/<value>', methods=['GET'])(self.quoted_put) route('/single/<address>', methods=['GET'])(self.get) route('/single/<address>', methods=['PUT'])(self.put) route('/multi', methods=['GET'])(self.multi_get) route('/multi/<address>', methods=['GET'])(self.multi_get) route('/multi', methods=['PUT'])(self.multi_put) route('/multi/<address>', methods=['PUT'])(self.multi_put) self.flask_server.start()
[docs] def set_project(self, project): self.project = project
[docs] def index(self): with open(self.index_file) as fp: return fp.read()
[docs] @decorator.single def get(self, editor): return self._get(editor)
[docs] @decorator.single def quoted_put(self, editor, value): unquoted = urllib.parse.unquote_plus(value) return self._set(editor, unquoted)
[docs] @decorator.single def put(self, editor): value = flask.request.values['value'] return self._set(editor, value)
[docs] @decorator.multi def multi_get(self, editor, address): return self._get(editor)
[docs] @decorator.multi def multi_put(self, editor, address): value = flask.request.values[address] return self._set(editor, value)
def _get(self, editor): return data_file.dumps(editor.get(), use_yaml=False) def _set(self, editor, value): loaded = data_file.loads(value) editor.set(loaded) return True @contextlib.contextmanager def _abort(self, code): try: yield except: if self.verbose: traceback.print_exc() flask.abort(code)