##// END OF EJS Templates
Show invalid config message on TraitErrors during initialization...
Show invalid config message on TraitErrors during initialization implemented via @catch_config decorator Now, the event that was triggered by invalid app config (see `--log-level 5`) is triggered by bad config at any point during initialization. This *will* catch TraitError bugs in IPython itself, but only during initialization. closes gh-908

File last commit:

r5172:7ed219c2
r5172:7ed219c2
Show More
notebookapp.py
317 lines | 11.6 KiB | text/x-python | PythonLexer
Brian E. Granger
More review changes....
r4609 """A tornado based IPython notebook server.
Authors:
* Brian Granger
"""
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344
#-----------------------------------------------------------------------------
Brian E. Granger
More review changes....
r4609 # Copyright (C) 2008-2011 The IPython Development Team
Brian E. Granger
Updating the notebook to work with the latex master....
r4348 #
# Distributed under the terms of the BSD License. The full license is in
Brian E. Granger
More review changes....
r4609 # the file COPYING, distributed as part of this software.
Brian E. Granger
Updating the notebook to work with the latex master....
r4348 #-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344 # Imports
#-----------------------------------------------------------------------------
Brian E. Granger
Autotry additional ports if 8888 if already in use.
r4548 import errno
Brian E. Granger
Creating files to new notebook app.
r4339 import logging
import os
Brian E. Granger
Notebook app debugging....
r4345 import signal
Brian E. Granger
Autotry additional ports if 8888 if already in use.
r4548 import socket
Brian E. Granger
Notebook app debugging....
r4345 import sys
Thomas Kluyver
Add ability to open the notebook in a browser when it starts.
r5065 import webbrowser
Brian E. Granger
Creating files to new notebook app.
r4339
import zmq
# Install the pyzmq ioloop. This has to be done before anything else from
# tornado is imported.
from zmq.eventloop import ioloop
import tornado.ioloop
MinRK
fix installation of zmq IOLoop into tornado...
r4829 tornado.ioloop.IOLoop = ioloop.IOLoop
Brian E. Granger
Creating files to new notebook app.
r4339
from tornado import httpserver
from tornado import web
Brian E. Granger
Major refactor of kernel connection management in the notebook....
r4545 from .kernelmanager import MappingKernelManager
Satrajit Ghosh
enh: added authentication ability for webapp
r4690 from .handlers import (LoginHandler,
Brian E. Granger
Renaming NBBrowserHandler->ProjectDashboardHandler.
r5112 ProjectDashboardHandler, NewHandler, NamedNotebookHandler,
Brian E. Granger
Major refactor of kernel connection management in the notebook....
r4545 MainKernelHandler, KernelHandler, KernelActionHandler, IOPubHandler,
ShellHandler, NotebookRootHandler, NotebookHandler, RSTHandler
Brian E. Granger
Fixing import statments in handlers and notebookapp.
r4340 )
Brian E. Granger
Massive work on the notebook document format....
r4484 from .notebookmanager import NotebookManager
Brian E. Granger
Creating files to new notebook app.
r4339
MinRK
Show invalid config message on TraitErrors during initialization...
r5172 from IPython.config.application import catch_config
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344 from IPython.core.application import BaseIPythonApplication
Brian E. Granger
Notebook app debugging....
r4345 from IPython.core.profiledir import ProfileDir
MinRK
enable HMAC message signing by default in notebook kernels...
r4963 from IPython.zmq.session import Session, default_secure
Brian E. Granger
Notebook app debugging....
r4345 from IPython.zmq.zmqshell import ZMQInteractiveShell
from IPython.zmq.ipkernel import (
flags as ipkernel_flags,
aliases as ipkernel_aliases,
IPKernelApp
)
Thomas Kluyver
Add ability to open the notebook in a browser when it starts.
r5065 from IPython.utils.traitlets import Dict, Unicode, Int, List, Enum, Bool
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344
#-----------------------------------------------------------------------------
# Module globals
#-----------------------------------------------------------------------------
Brian E. Granger
Creating files to new notebook app.
r4339
_kernel_id_regex = r"(?P<kernel_id>\w+-\w+-\w+-\w+-\w+)"
_kernel_action_regex = r"(?P<action>restart|interrupt)"
Brian E. Granger
Massive work on the notebook document format....
r4484 _notebook_id_regex = r"(?P<notebook_id>\w+-\w+-\w+-\w+-\w+)"
Brian E. Granger
Creating files to new notebook app.
r4339
Brian E. Granger
Notebook app debugging....
r4345 LOCALHOST = '127.0.0.1'
Brian E. Granger
Updating notebook configuration....
r4519 _examples = """
ipython notebook # start the notebook
ipython notebook --profile=sympy # use the sympy profile
ipython notebook --pylab=inline # pylab in inline plotting mode
ipython notebook --certfile=mycert.pem # use SSL/TLS certificate
ipython notebook --port=5555 --ip=* # Listen on port 5555, all interfaces
"""
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344 #-----------------------------------------------------------------------------
# The Tornado web application
#-----------------------------------------------------------------------------
Brian E. Granger
Creating files to new notebook app.
r4339
Brian E. Granger
Renaming NotebookApplication to NotebookWebApplication.
r4342 class NotebookWebApplication(web.Application):
Brian E. Granger
Creating files to new notebook app.
r4339
Brian E. Granger
WebSocket url is now passed to browser when a kernel is started.
r4572 def __init__(self, ipython_app, kernel_manager, notebook_manager, log):
Brian E. Granger
Creating files to new notebook app.
r4339 handlers = [
Brian E. Granger
Renaming NBBrowserHandler->ProjectDashboardHandler.
r5112 (r"/", ProjectDashboardHandler),
Satrajit Ghosh
enh: added authentication ability for webapp
r4690 (r"/login", LoginHandler),
Brian E. Granger
Implemented basic notebook browser and fixed numerous bugs.
r4488 (r"/new", NewHandler),
Brian E. Granger
Massive work on the notebook document format....
r4484 (r"/%s" % _notebook_id_regex, NamedNotebookHandler),
Brian E. Granger
Adding kernel/notebook associations.
r4494 (r"/kernels", MainKernelHandler),
(r"/kernels/%s" % _kernel_id_regex, KernelHandler),
Brian E. Granger
Creating files to new notebook app.
r4339 (r"/kernels/%s/%s" % (_kernel_id_regex, _kernel_action_regex), KernelActionHandler),
Brian E. Granger
Major refactor of kernel connection management in the notebook....
r4545 (r"/kernels/%s/iopub" % _kernel_id_regex, IOPubHandler),
(r"/kernels/%s/shell" % _kernel_id_regex, ShellHandler),
Brian E. Granger
Creating files to new notebook app.
r4339 (r"/notebooks", NotebookRootHandler),
Brian E. Granger
Starting work on a Markdown cell.
r4507 (r"/notebooks/%s" % _notebook_id_regex, NotebookHandler),
(r"/rstservice/render", RSTHandler)
Brian E. Granger
Creating files to new notebook app.
r4339 ]
settings = dict(
template_path=os.path.join(os.path.dirname(__file__), "templates"),
static_path=os.path.join(os.path.dirname(__file__), "static"),
MinRK
notebook auth adjustments...
r4705 cookie_secret=os.urandom(1024),
Satrajit Ghosh
enh: added authentication ability for webapp
r4690 login_url="/login",
Brian E. Granger
Creating files to new notebook app.
r4339 )
web.Application.__init__(self, handlers, **settings)
Brian E. Granger
Major refactor of kernel connection management in the notebook....
r4545 self.kernel_manager = kernel_manager
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344 self.log = log
Brian E. Granger
Adding kernel/notebook associations.
r4494 self.notebook_manager = notebook_manager
Brian E. Granger
WebSocket url is now passed to browser when a kernel is started.
r4572 self.ipython_app = ipython_app
Brian E. Granger
Creating files to new notebook app.
r4339
Brian E. Granger
Work to adapt routers to new Session message protocol.
r4346
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344 #-----------------------------------------------------------------------------
# Aliases and Flags
#-----------------------------------------------------------------------------
flags = dict(ipkernel_flags)
Thomas Kluyver
Add ability to open the notebook in a browser when it starts.
r5065 flags['no-browser']=(
MinRK
fix --no-browser flag in notebook after rename
r5128 {'NotebookApp' : {'open_browser' : False}},
Thomas Kluyver
Add ability to open the notebook in a browser when it starts.
r5065 "Don't open the notebook in a browser after startup."
)
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344
# the flags that are specific to the frontend
# these must be scrubbed before being passed to the kernel,
# or it will raise an error on unrecognized flags
Thomas Kluyver
Add ability to open the notebook in a browser when it starts.
r5065 notebook_flags = ['no-browser']
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344
aliases = dict(ipkernel_aliases)
Brian E. Granger
Updating notebook configuration....
r4519 aliases.update({
Brian E. Granger
Misc changes to the notebook....
r5104 'ip': 'NotebookApp.ip',
'port': 'NotebookApp.port',
'keyfile': 'NotebookApp.keyfile',
'certfile': 'NotebookApp.certfile',
'ws-hostname': 'NotebookApp.ws_hostname',
Satrajit Ghosh
enh: added authentication ability for webapp
r4690 'notebook-dir': 'NotebookManager.notebook_dir',
Brian E. Granger
Updating notebook configuration....
r4519 })
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344
MinRK
enable HMAC message signing by default in notebook kernels...
r4963 # remove ipkernel flags that are singletons, and don't make sense in
# multi-kernel evironment:
aliases.pop('f', None)
Brian E. Granger
Stripping notebook server flags from kernel's argv.
r4579 notebook_aliases = [u'port', u'ip', u'keyfile', u'certfile', u'ws-hostname',
MinRK
notebook auth adjustments...
r4705 u'notebook-dir']
Brian E. Granger
Stripping notebook server flags from kernel's argv.
r4579
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344 #-----------------------------------------------------------------------------
Brian E. Granger
Misc changes to the notebook....
r5104 # NotebookApp
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344 #-----------------------------------------------------------------------------
Brian E. Granger
Misc changes to the notebook....
r5104 class NotebookApp(BaseIPythonApplication):
Brian E. Granger
Updating notebook configuration....
r4519
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344 name = 'ipython-notebook'
default_config_file_name='ipython_notebook_config.py'
description = """
The IPython HTML Notebook.
This launches a Tornado based HTML Notebook Server that serves up an
HTML5/Javascript Notebook client.
"""
Brian E. Granger
Updating notebook configuration....
r4519 examples = _examples
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344
classes = [IPKernelApp, ZMQInteractiveShell, ProfileDir, Session,
Brian E. Granger
Major refactor of kernel connection management in the notebook....
r4545 MappingKernelManager, NotebookManager]
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344 flags = Dict(flags)
aliases = Dict(aliases)
kernel_argv = List(Unicode)
Brian E. Granger
Notebook app debugging....
r4345 log_level = Enum((0,10,20,30,40,50,'DEBUG','INFO','WARN','ERROR','CRITICAL'),
default_value=logging.INFO,
config=True,
help="Set the log level by value or name.")
Brian E. Granger
Updating notebook configuration....
r4519 # Network related information.
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344 ip = Unicode(LOCALHOST, config=True,
help="The IP address the notebook server will listen on."
)
Brian E. Granger
Updating notebook configuration....
r4519 def _ip_changed(self, name, old, new):
if new == u'*': self.ip = u''
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344 port = Int(8888, config=True,
help="The port the notebook server will listen on."
)
Brian E. Granger
WebSocket url is now passed to browser when a kernel is started.
r4572 ws_hostname = Unicode(LOCALHOST, config=True,
help="""The FQDN or IP for WebSocket connections. The default will work
fine when the server is listening on localhost, but this needs to
be set if the ip option is used. It will be used as the hostname part
of the WebSocket url: ws://hostname/path."""
)
Brian E. Granger
Updating notebook configuration....
r4519 certfile = Unicode(u'', config=True,
help="""The full path to an SSL/TLS certificate file."""
)
keyfile = Unicode(u'', config=True,
help="""The full path to a private key file for usage with SSL/TLS."""
)
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344
MinRK
notebook auth adjustments...
r4705 password = Unicode(u'', config=True,
help="""Password to use for web authentication"""
Satrajit Ghosh
enh: added authentication ability for webapp
r4690 )
Thomas Kluyver
Add ability to open the notebook in a browser when it starts.
r5065
open_browser = Bool(True, config=True,
help="Whether to open in a browser after starting.")
Satrajit Ghosh
enh: added authentication ability for webapp
r4690
Brian E. Granger
WebSocket url is now passed to browser when a kernel is started.
r4572 def get_ws_url(self):
"""Return the WebSocket URL for this server."""
if self.certfile:
prefix = u'wss://'
else:
prefix = u'ws://'
return prefix + self.ws_hostname + u':' + unicode(self.port)
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344 def parse_command_line(self, argv=None):
Brian E. Granger
Misc changes to the notebook....
r5104 super(NotebookApp, self).parse_command_line(argv)
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344 if argv is None:
argv = sys.argv[1:]
self.kernel_argv = list(argv) # copy
Brian E. Granger
More review changes....
r4609 # Kernel should inherit default config file from frontend
Brian E. Granger
Notebook app debugging....
r4345 self.kernel_argv.append("--KernelApp.parent_appname='%s'"%self.name)
Brian E. Granger
More review changes....
r4609 # Scrub frontend-specific flags
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344 for a in argv:
Brian E. Granger
Notebook app debugging....
r4345 if a.startswith('-') and a.lstrip('-') in notebook_flags:
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344 self.kernel_argv.remove(a)
MinRK
fix kernel_argv scrubbing to cover args passed with space...
r4957 swallow_next = False
Brian E. Granger
Stripping notebook server flags from kernel's argv.
r4579 for a in argv:
MinRK
fix kernel_argv scrubbing to cover args passed with space...
r4957 if swallow_next:
self.kernel_argv.remove(a)
swallow_next = False
continue
Brian E. Granger
Stripping notebook server flags from kernel's argv.
r4579 if a.startswith('-'):
MinRK
fix typo in stripping kernel args in nb and qt...
r5015 split = a.lstrip('-').split('=')
MinRK
fix kernel_argv scrubbing to cover args passed with space...
r4957 alias = split[0]
Brian E. Granger
Stripping notebook server flags from kernel's argv.
r4579 if alias in notebook_aliases:
self.kernel_argv.remove(a)
MinRK
fix kernel_argv scrubbing to cover args passed with space...
r4957 if len(split) == 1:
# alias passed with arg via space
swallow_next = True
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344
Brian E. Granger
Adding kernel/notebook associations.
r4494 def init_configurables(self):
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344 # Don't let Qt or ZMQ swallow KeyboardInterupts.
signal.signal(signal.SIGINT, signal.SIG_DFL)
MinRK
enable HMAC message signing by default in notebook kernels...
r4963 # force Session default to be secure
default_secure(self.config)
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344 # Create a KernelManager and start a kernel.
Brian E. Granger
Major refactor of kernel connection management in the notebook....
r4545 self.kernel_manager = MappingKernelManager(
MinRK
use zmq.KernelManager to manage individual kernels in notebook...
r4960 config=self.config, log=self.log, kernel_argv=self.kernel_argv,
connection_dir = self.profile_dir.security_dir,
Brian E. Granger
Adding kernel/notebook associations.
r4494 )
self.notebook_manager = NotebookManager(config=self.config, log=self.log)
Brian E. Granger
Changing notebook uuid algorithm to preserver across sessions.
r4622 self.notebook_manager.list_notebooks()
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344
Brian E. Granger
Notebook app debugging....
r4345 def init_logging(self):
Brian E. Granger
Misc changes to the notebook....
r5104 super(NotebookApp, self).init_logging()
Brian E. Granger
Notebook app debugging....
r4345 # This prevents double log messages because tornado use a root logger that
# self.log is a child of. The logging module dipatches log messages to a log
# and all of its ancenstors until propagate is set to False.
self.log.propagate = False
MinRK
Show invalid config message on TraitErrors during initialization...
r5172 @catch_config
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344 def initialize(self, argv=None):
Brian E. Granger
Misc changes to the notebook....
r5104 super(NotebookApp, self).initialize(argv)
Brian E. Granger
Adding kernel/notebook associations.
r4494 self.init_configurables()
Brian E. Granger
More work on updating the notebook zmq forwarding.
r4347 self.web_app = NotebookWebApplication(
Brian E. Granger
WebSocket url is now passed to browser when a kernel is started.
r4572 self, self.kernel_manager, self.notebook_manager, self.log
Brian E. Granger
More work on updating the notebook zmq forwarding.
r4347 )
Brian E. Granger
Updating notebook configuration....
r4519 if self.certfile:
ssl_options = dict(certfile=self.certfile)
if self.keyfile:
ssl_options['keyfile'] = self.keyfile
else:
ssl_options = None
MinRK
notebook auth adjustments...
r4705 self.web_app.password = self.password
Brian E. Granger
Updating notebook configuration....
r4519 self.http_server = httpserver.HTTPServer(self.web_app, ssl_options=ssl_options)
if ssl_options is None and not self.ip:
self.log.critical('WARNING: the notebook server is listening on all IP addresses '
'but not using any encryption or authentication. This is highly '
'insecure and not recommended.')
Brian E. Granger
More review changes....
r4609
# Try random ports centered around the default.
from random import randint
n = 50 # Max number of attempts, keep reasonably large.
for port in [self.port] + [self.port + randint(-2*n, 2*n) for i in range(n)]:
Brian E. Granger
Autotry additional ports if 8888 if already in use.
r4548 try:
self.http_server.listen(port, self.ip)
except socket.error, e:
if e.errno != errno.EADDRINUSE:
raise
Brian E. Granger
More review changes....
r4609 self.log.info('The port %i is already in use, trying another random port.' % port)
Brian E. Granger
Autotry additional ports if 8888 if already in use.
r4548 else:
self.port = port
break
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344
def start(self):
Brian E. Granger
Updating notebook configuration....
r4519 ip = self.ip if self.ip else '[all ip addresses on your system]'
Satrajit Ghosh
fix: applied fernando's if simplification fix
r4682 proto = 'https' if self.certfile else 'http'
Satrajit Ghosh
fix: display secure url with proper protocol
r4680 self.log.info("The IPython Notebook is running at: %s://%s:%i" % (proto,
ip,
self.port))
Thomas Kluyver
Add ability to open the notebook in a browser when it starts.
r5065 if self.open_browser:
ip = self.ip or '127.0.0.1'
webbrowser.open("%s://%s:%i" % (proto, ip, self.port), new=2)
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344 ioloop.IOLoop.instance().start()
#-----------------------------------------------------------------------------
# Main entry point
#-----------------------------------------------------------------------------
Brian E. Granger
Creating files to new notebook app.
r4339
Brian E. Granger
Initial reorg of files complete....
r4341 def launch_new_instance():
Brian E. Granger
Misc changes to the notebook....
r5104 app = NotebookApp()
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344 app.initialize()
app.start()
Brian E. Granger
Creating files to new notebook app.
r4339