1616import base64
1717import traceback
1818from urllib .parse import urlparse
19- from typing import Any , Callable , Dict , Optional , Union
19+ from typing import Any , Callable , Dict , Optional , Union , List
2020
2121import flask
2222
@@ -175,11 +175,13 @@ def _do_skip(error):
175175
176176 # werkzeug<2.1.0
177177 if hasattr (tbtools , "get_current_traceback" ):
178- return tbtools .get_current_traceback (skip = _get_skip (error )).render_full ()
178+ return tbtools .get_current_traceback ( # type: ignore
179+ skip = _get_skip (error )
180+ ).render_full ()
179181
180182 if hasattr (tbtools , "DebugTraceback" ):
181183 # pylint: disable=no-member
182- return tbtools .DebugTraceback (
184+ return tbtools .DebugTraceback ( # type: ignore
183185 error , skip = _get_skip (error )
184186 ).render_debugger_html (True , secret , True )
185187
@@ -378,41 +380,47 @@ class Dash:
378380 _plotlyjs_url : str
379381 STARTUP_ROUTES : list = []
380382
383+ server : flask .Flask
384+
381385 def __init__ ( # pylint: disable=too-many-statements
382386 self ,
383- name = None ,
384- server = True ,
385- assets_folder = "assets" ,
386- pages_folder = "pages" ,
387- use_pages = None ,
388- assets_url_path = "assets" ,
389- assets_ignore = "" ,
390- assets_external_path = None ,
391- eager_loading = False ,
392- include_assets_files = True ,
393- include_pages_meta = True ,
394- url_base_pathname = None ,
395- requests_pathname_prefix = None ,
396- routes_pathname_prefix = None ,
397- serve_locally = True ,
398- compress = None ,
399- meta_tags = None ,
400- index_string = _default_index ,
401- external_scripts = None ,
402- external_stylesheets = None ,
403- suppress_callback_exceptions = None ,
404- prevent_initial_callbacks = False ,
405- show_undo_redo = False ,
406- extra_hot_reload_paths = None ,
407- plugins = None ,
408- title = "Dash" ,
409- update_title = "Updating..." ,
410- long_callback_manager = None ,
411- background_callback_manager = None ,
412- add_log_handler = True ,
413- hooks : Union [RendererHooks , None ] = None ,
387+ name : Optional [str ] = None ,
388+ server : Union [bool , flask .Flask ] = True ,
389+ assets_folder : str = "assets" ,
390+ pages_folder : str = "pages" ,
391+ use_pages : Optional [bool ] = None ,
392+ assets_url_path : str = "assets" ,
393+ assets_ignore : str = "" ,
394+ assets_external_path : Optional [str ] = None ,
395+ eager_loading : bool = False ,
396+ include_assets_files : bool = True ,
397+ include_pages_meta : bool = True ,
398+ url_base_pathname : Optional [str ] = None ,
399+ requests_pathname_prefix : Optional [str ] = None ,
400+ routes_pathname_prefix : Optional [str ] = None ,
401+ serve_locally : bool = True ,
402+ compress : Optional [bool ] = None ,
403+ meta_tags : Optional [List [Dict [str , Any ]]] = None ,
404+ index_string : str = _default_index ,
405+ external_scripts : Optional [List [Union [str , Dict [str , Any ]]]] = None ,
406+ external_stylesheets : Optional [List [Union [str , Dict [str , Any ]]]] = None ,
407+ suppress_callback_exceptions : Optional [bool ] = None ,
408+ prevent_initial_callbacks : bool = False ,
409+ show_undo_redo : bool = False ,
410+ extra_hot_reload_paths : Optional [List [str ]] = None ,
411+ plugins : Optional [list ] = None ,
412+ title : str = "Dash" ,
413+ update_title : str = "Updating..." ,
414+ long_callback_manager : Optional [
415+ Any
416+ ] = None , # Type should be specified if possible
417+ background_callback_manager : Optional [
418+ Any
419+ ] = None , # Type should be specified if possible
420+ add_log_handler : bool = True ,
421+ hooks : Optional [RendererHooks ] = None ,
414422 routing_callback_inputs : Optional [Dict [str , Union [Input , State ]]] = None ,
415- description = None ,
423+ description : Optional [ str ] = None ,
416424 on_error : Optional [Callable [[Exception ], Any ]] = None ,
417425 ** obsolete ,
418426 ):
@@ -428,7 +436,7 @@ def __init__( # pylint: disable=too-many-statements
428436 name = getattr (server , "name" , caller_name )
429437 elif isinstance (server , bool ):
430438 name = name if name else caller_name
431- self .server = flask .Flask (name ) if server else None
439+ self .server = flask .Flask (name ) if server else None # type: ignore
432440 else :
433441 raise ValueError ("server must be a Flask app or a boolean" )
434442
@@ -440,7 +448,7 @@ def __init__( # pylint: disable=too-many-statements
440448 name = name ,
441449 assets_folder = os .path .join (
442450 flask .helpers .get_root_path (name ), assets_folder
443- ),
451+ ), # type: ignore
444452 assets_url_path = assets_url_path ,
445453 assets_ignore = assets_ignore ,
446454 assets_external_path = get_combined_config (
@@ -539,14 +547,29 @@ def __init__( # pylint: disable=too-many-statements
539547
540548 self ._assets_files = []
541549 self ._long_callback_count = 0
550+ if long_callback_manager :
551+ warnings .warn (
552+ DeprecationWarning (
553+ "`long_callback_manager` is deprecated and will be remove in Dash 3.0, "
554+ "use `background_callback_manager` instead."
555+ )
556+ )
542557 self ._background_manager = background_callback_manager or long_callback_manager
543558
544559 self .logger = logging .getLogger (__name__ )
545560
546561 if not self .logger .handlers and add_log_handler :
547562 self .logger .addHandler (logging .StreamHandler (stream = sys .stdout ))
548563
549- if isinstance (plugins , patch_collections_abc ("Iterable" )):
564+ if plugins is not None and isinstance (
565+ plugins , patch_collections_abc ("Iterable" )
566+ ):
567+ warnings .warn (
568+ DeprecationWarning (
569+ "The `plugins` keyword will be removed from Dash init in Dash 3.0 "
570+ "and replaced by a new hook system."
571+ )
572+ )
550573 for plugin in plugins :
551574 plugin .plug (self )
552575
@@ -1961,7 +1984,7 @@ def run(
19611984 port = "8050" ,
19621985 proxy = None ,
19631986 debug = None ,
1964- jupyter_mode : JupyterDisplayMode = None ,
1987+ jupyter_mode : Optional [ JupyterDisplayMode ] = None ,
19651988 jupyter_width = "100%" ,
19661989 jupyter_height = 650 ,
19671990 jupyter_server_url = None ,
@@ -2096,7 +2119,7 @@ def run(
20962119 port = int (port )
20972120 assert port in range (1 , 65536 )
20982121 except Exception as e :
2099- e .args = [ f"Expecting an integer from 1 to 65535, found port={ repr (port )} " ]
2122+ e .args = ( f"Expecting an integer from 1 to 65535, found port={ repr (port )} " ,)
21002123 raise
21012124
21022125 # so we only see the "Running on" message once with hot reloading
@@ -2256,4 +2279,9 @@ def run_server(self, *args, **kwargs):
22562279
22572280 See `app.run` for usage information.
22582281 """
2282+ warnings .warn (
2283+ DeprecationWarning (
2284+ "Dash.run_server is deprecated and will be removed in Dash 3.0"
2285+ )
2286+ )
22592287 self .run (* args , ** kwargs )
0 commit comments