diff --git a/IPython/html/notebookapp.py b/IPython/html/notebookapp.py index 291094ce2..829dc0ec5 100644 --- a/IPython/html/notebookapp.py +++ b/IPython/html/notebookapp.py @@ -9,6 +9,7 @@ from __future__ import print_function import base64 import datetime import errno +import importlib import io import json import logging @@ -709,6 +710,10 @@ class NotebookApp(BaseIPythonApplication): self.config.FileContentsManager.root_dir = new self.config.MappingKernelManager.root_dir = new + extensions = List(Unicode(), config=True, + help="Python modules to load as notebook server extensions" + ) + def parse_command_line(self, argv=None): super(NotebookApp, self).parse_command_line(argv) @@ -915,6 +920,22 @@ class NotebookApp(BaseIPythonApplication): elif status == 'unclean': self.log.warn("components submodule unclean, you may see 404s on static/components") self.log.warn("run `setup.py submodule` or `git submodule update` to update") + + def init_extensions(self): + """Load any extensions specified by config. + + Import the module, then call the load_jupyter_server_extension function, + if one exists. + """ + for modulename in self.extensions: + try: + mod = importlib.import_module(modulename) + func = getattr(mod, 'load_jupyter_server_extension', None) + if func is not None: + func(self) + except Exception: + self.log.warn("Error loading server extension %s", modulename, + exc_info=True) @catch_config_error def initialize(self, argv=None): @@ -926,6 +947,7 @@ class NotebookApp(BaseIPythonApplication): self.init_webapp() self.init_terminals() self.init_signal() + self.init_extensions() def cleanup_kernels(self): """Shutdown all kernels.