From 56a641974e7edb49c63beb08574731a5b152b4f7 Mon Sep 17 00:00:00 2001 From: Ryan Marren Date: Sun, 29 Jul 2018 14:57:23 -0400 Subject: [PATCH 1/4] Back-end errors propagated to front. --- dash/dash.py | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/dash/dash.py b/dash/dash.py index 44fad1efee..41fc50d0a2 100644 --- a/dash/dash.py +++ b/dash/dash.py @@ -8,6 +8,7 @@ import pkgutil import warnings import re +import traceback from functools import wraps @@ -16,6 +17,8 @@ import flask from flask import Flask, Response from flask_compress import Compress +from flask import got_request_exception +from flask_socketio import SocketIO from .dependencies import Event, Input, Output, State from .resources import Scripts, Css @@ -114,6 +117,7 @@ def __init__( self.index_string = index_string self._meta_tags = meta_tags or [] self._favicon = None + self._errors = "" if compress: # gzip @@ -760,4 +764,24 @@ def run_server(self, port=8050, debug=False, **flask_run_options): - self.server.run(port=port, debug=debug, **flask_run_options) + if debug: + socketio = SocketIO(self.server) + + @got_request_exception.connect_via(self.server) + def when_dash_gets_exception(server, exception, **extra): + socketio.emit( + 'error', + { + 'errorType': type(exception).__name__, + 'errorMessage': str(exception), + 'errorTraceback': traceback.format_exc(), + }, + namespace=( + '{}_dash-errors' + .format(self.config['routes_pathname_prefix']) + ) + ) + + socketio.run(self.server, port=port, debug=debug) + else: + self.server.run(port=port, debug=debug, **flask_run_options) From b287e89bc7fcffa30829c0e7f953d312e48448d3 Mon Sep 17 00:00:00 2001 From: Ryan Marren Date: Sun, 29 Jul 2018 17:12:43 -0400 Subject: [PATCH 2/4] Add Flask-SocketIO dependency. --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 4eb352abdc..2a7c86ab36 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,6 +10,7 @@ enum34==1.1.6 Flask==0.12 Flask-Compress==1.4.0 Flask-SeaSurf==0.2.2 +Flask-SocketIO==3.0.1 funcsigs==1.0.2 functools32==3.2.3.post2 ipdb==0.10.2 From b68deadb2b878cd5dac3fe72575c4cd4114bfee4 Mon Sep 17 00:00:00 2001 From: Ryan Marren Date: Sun, 29 Jul 2018 17:16:55 -0400 Subject: [PATCH 3/4] Add Flask-SocketIO to dev depencencies as well. --- dev-requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-requirements.txt b/dev-requirements.txt index f667e354c3..1701b91b18 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -13,3 +13,4 @@ plotly>=2.0.8 requests[security] flake8 pylint==1.9.2 +Flask-SocketIO==3.0.1 From ffcd49a6166cd65ee45cf6627fc5341fd8f3752b Mon Sep 17 00:00:00 2001 From: Ryan Marren Date: Sun, 29 Jul 2018 22:04:19 -0400 Subject: [PATCH 4/4] Pylint fixes. --- dash/dash.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dash/dash.py b/dash/dash.py index 41fc50d0a2..73e9060023 100644 --- a/dash/dash.py +++ b/dash/dash.py @@ -15,9 +15,8 @@ import plotly import dash_renderer import flask -from flask import Flask, Response +from flask import Flask, Response, got_request_exception from flask_compress import Compress -from flask import got_request_exception from flask_socketio import SocketIO from .dependencies import Event, Input, Output, State @@ -768,6 +767,7 @@ def run_server(self, socketio = SocketIO(self.server) @got_request_exception.connect_via(self.server) + # pylint: disable=unused-variable def when_dash_gets_exception(server, exception, **extra): socketio.emit( 'error', @@ -777,8 +777,8 @@ def when_dash_gets_exception(server, exception, **extra): 'errorTraceback': traceback.format_exc(), }, namespace=( - '{}_dash-errors' - .format(self.config['routes_pathname_prefix']) + '{}_dash-errors' + .format(self.config['routes_pathname_prefix']) ) )