Source code for bibliopixel.control.rest.flask_server

import flask, werkzeug.serving
from werkzeug.datastructures import ImmutableOrderedMultiDict

from ... util import log
from ... util.threads import runnable
from ... animation.remote import opener


[docs]class OrderedFlask(flask.Flask): # http://flask.pocoo.org/docs/1.0/patterns/subclassing/
[docs] class request_class(flask.Request): parameter_storage_class = ImmutableOrderedMultiDict
[docs]class FlaskServer(runnable.LoopThread): OPEN_DELAY = 1 def __init__(self, port, external_access, open_page, **kwds): super().__init__() self.port = port self.hostname = '0.0.0.0' if external_access else 'localhost' self.app = OrderedFlask(__name__, **kwds) self.open_page = open_page
[docs] def run_once(self): if self.open_page: opener.raw_opener('localhost', self.port, self.OPEN_DELAY) werkzeug.serving.run_simple(self.hostname, self.port, self.app) super().stop()
[docs] def stop(self): def error(): log.error('Unable to shut down REST server on port %d', self.port) super().stop() try: flask.request.environ.get('werkzeug.server.shutdown', error)() except Exception: log.debug('Exception shutting werkzeug down')