def __init__(self, logger, *args, **kwargs): self.logger = logger super(WebsocketHandler, self).__init__(*args, **kwargs) self.web_server = None self.dashboard_subscribers = [] self.html_formatter = HtmlFormatter()
class WebsocketHandler(logging.Handler): def __init__(self, logger, *args, **kwargs): self.logger = logger super(WebsocketHandler, self).__init__(*args, **kwargs) self.web_server = None self.dashboard_subscribers = [] self.html_formatter = HtmlFormatter() def emit(self, update): scrapa_data = None if hasattr(update, "scrapa"): scrapa_data = update.scrapa if scrapa_data is not None: self.emit_to_subscribers(json_dumps(scrapa_data)) data = self.get_html_for_exception(update) if scrapa_data and data is not None: exception_data = dict(scrapa_data) exception_data["data"] = data exception_data["name"] = sys.exc_info()[0].__name__ self.emit_to_subscribers(json_dumps(exception_data)) def emit_to_subscribers(self, data): for sub in self.dashboard_subscribers: if not sub.closed: sub.send_str(data) def get_html_for_exception(self, record): exception_info = record.exc_info record.exc_info = False if isinstance(exception_info, tuple): exception_info = ExceptionInfo.from_values(*exception_info) elif exception_info: exception_info = ExceptionInfo.new() if exception_info: return self.html_formatter.format_exception(exception_info, record.getMessage()) async def websocket_handler(self, request): ws = web.WebSocketResponse() ws.start(request) self.dashboard_subscribers.append(ws) while not ws.closed: msg = await ws.receive() if msg.tp == aiohttp.MsgType.text: if msg.data == "close": await ws.close() elif msg.tp == aiohttp.MsgType.close: self.logger.debug("websocket connection closed") elif msg.tp == aiohttp.MsgType.error: self.logger.debug("ws connection closed with exception %s", ws.exception()) self.dashboard_subscribers.remove(ws) return ws async def make_server(self, logger=None, host="127.0.0.1", port="5494", loop=None): from .dashboard import index, static if loop is None: loop = asyncio.get_event_loop() self.web_app = web.Application() self.web_app.router.add_route("GET", "/", index) self.web_app.router.add_route("GET", "/ws", self.websocket_handler) self.web_app.router.add_route("GET", r"/static/{path:.+}", static) self.web_handler = self.web_app.make_handler() self.web_server = await loop.create_server(self.web_handler, host, port) logger.info("Serving on http://%s:%s" % self.web_server.sockets[0].getsockname()) async def close_server(self): await self.web_handler.finish_connections(1.0) self.web_server.close() await self.web_server.wait_closed() await self.web_app.finish()
class WebsocketHandler(logging.Handler): def __init__(self, logger, *args, **kwargs): self.logger = logger super(WebsocketHandler, self).__init__(*args, **kwargs) self.web_server = None self.dashboard_subscribers = [] self.html_formatter = HtmlFormatter() def emit(self, update): scrapa_data = None if hasattr(update, 'scrapa'): scrapa_data = update.scrapa if scrapa_data is not None: self.emit_to_subscribers(json_dumps(scrapa_data)) data = self.get_html_for_exception(update) if scrapa_data and data is not None: exception_data = dict(scrapa_data) exception_data['data'] = data exception_data['name'] = sys.exc_info()[0].__name__ self.emit_to_subscribers(json_dumps(exception_data)) def emit_to_subscribers(self, data): for sub in self.dashboard_subscribers: if not sub.closed: sub.send_str(data) def get_html_for_exception(self, record): exception_info = record.exc_info record.exc_info = False if isinstance(exception_info, tuple): exception_info = ExceptionInfo.from_values(*exception_info) elif exception_info: exception_info = ExceptionInfo.new() if exception_info: return self.html_formatter.format_exception( exception_info, record.getMessage()) async def websocket_handler(self, request): ws = web.WebSocketResponse() ws.start(request) self.dashboard_subscribers.append(ws) while not ws.closed: msg = await ws.receive() if msg.tp == aiohttp.MsgType.text: if msg.data == 'close': await ws.close() elif msg.tp == aiohttp.MsgType.close: self.logger.debug('websocket connection closed') elif msg.tp == aiohttp.MsgType.error: self.logger.debug('ws connection closed with exception %s', ws.exception()) self.dashboard_subscribers.remove(ws) return ws async def make_server(self, logger=None, host='127.0.0.1', port='5494', loop=None): from .dashboard import index, static if loop is None: loop = asyncio.get_event_loop() self.web_app = web.Application() self.web_app.router.add_route('GET', '/', index) self.web_app.router.add_route('GET', '/ws', self.websocket_handler) self.web_app.router.add_route('GET', r'/static/{path:.+}', static) self.web_handler = self.web_app.make_handler() self.web_server = await loop.create_server(self.web_handler, host, port) logger.info('Serving on http://%s:%s' % self.web_server.sockets[0].getsockname()) async def close_server(self): await self.web_handler.finish_connections(1.0) self.web_server.close() await self.web_server.wait_closed() await self.web_app.finish()