##// END OF EJS Templates
Merge pull request #3181 from minrk/ifsince...
Merge pull request #3181 from minrk/ifsince backport If-Modified-Since fix from tornado See facebook/tornado#713 closes #3177

File last commit:

r10201:06a54042
r10342:30ff0758 merge
Show More
notebookapp.py
718 lines | 28.1 KiB | text/x-python | PythonLexer
MinRK
Ensure handler patterns are str, not unicode...
r6067 # coding: utf-8
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
#-----------------------------------------------------------------------------
Fernando Perez
Start webbrowser in a thread. Prevents lockup with Chrome....
r5212 # stdlib
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
Bradley M. Froehle
NotebookApp: Make the number of ports to retry user configurable....
r7234 import random
MinRK
handle old pyzmq in notebook exit confirmation...
r6509 import re
MinRK
confirm notebook shutdown on SIGINT...
r6508 import select
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
Fernando Perez
Start webbrowser in a thread. Prevents lockup with Chrome....
r5212 import threading
MinRK
handle old pyzmq in notebook exit confirmation...
r6509 import time
Bradley M. Froehle
Notebook: Store the username in a cookie whose name is unique....
r8340 import uuid
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
MinRK
move DEFAULT_STATIC_FILES_PATH to frontend.html.notebook...
r10199
Fernando Perez
Start webbrowser in a thread. Prevents lockup with Chrome....
r5212 # Third party
MinRK
move check_for_zmq to utils.zmqrelated
r10201 # check for pyzmq 2.1.11
from IPython.utils.zmqrelated import check_for_zmq
MinRK
move DEFAULT_STATIC_FILES_PATH to frontend.html.notebook...
r10199 check_for_zmq('2.1.11', 'IPython.frontend.html.notebook')
Brian E. Granger
Creating files to new notebook app.
r4339 import zmq
Cameron Bates
Move environment setting from handler to the notebook application
r8840 from jinja2 import Environment, FileSystemLoader
Brian E. Granger
Creating files to new notebook app.
r4339
# Install the pyzmq ioloop. This has to be done before anything else from
# tornado is imported.
from zmq.eventloop import ioloop
MinRK
add ioloop.install to backported patches
r6631 ioloop.install()
Brian E. Granger
Creating files to new notebook app.
r4339
MinRK
move DEFAULT_STATIC_FILES_PATH to frontend.html.notebook...
r10199 # check for tornado 2.1.0
msg = "The IPython Notebook requires tornado >= 2.1.0"
try:
import tornado
except ImportError:
raise ImportError(msg)
try:
version_info = tornado.version_info
except AttributeError:
raise ImportError(msg + ", but you have < 1.1.0")
if version_info < (2,1,0):
raise ImportError(msg + ", but you have %s" % tornado.version)
Brian E. Granger
Creating files to new notebook app.
r4339 from tornado import httpserver
from tornado import web
Fernando Perez
Start webbrowser in a thread. Prevents lockup with Chrome....
r5212 # Our own libraries
MinRK
move DEFAULT_STATIC_FILES_PATH to frontend.html.notebook...
r10199 from IPython.frontend.html.notebook import DEFAULT_STATIC_FILES_PATH
Brian E. Granger
Major refactor of kernel connection management in the notebook....
r4545 from .kernelmanager import MappingKernelManager
Stefan van der Walt
Add logout button.
r5325 from .handlers import (LoginHandler, LogoutHandler,
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,
Brian Granger
Beginning work on notebook duplication.
r5860 ShellHandler, NotebookRootHandler, NotebookHandler, NotebookCopyHandler,
Brian Granger
First version of cluster web service....
r6191 RSTHandler, AuthenticatedFileHandler, PrintNotebookHandler,
MinRK
use FileFindHandler in NotebookApp...
r7923 MainClusterHandler, ClusterProfileHandler, ClusterActionHandler,
MinRK
add redirect handler for notebooks by name...
r10008 FileFindHandler, NotebookRedirectHandler,
Brian E. Granger
Fixing import statments in handlers and notebookapp.
r4340 )
Brian Granger
Renaming BaseNotebookManager->NotebookManager to preserve config.
r8194 from .nbmanager import NotebookManager
Brian Granger
Fixing minor bugs in notebookapp related to base class name.
r8183 from .filenbmanager import FileNotebookManager
Brian Granger
First version of cluster web service....
r6191 from .clustermanager import ClusterManager
Brian E. Granger
Creating files to new notebook app.
r4339
Fernando Perez
Define flags in application that's going to use them.
r5762 from IPython.config.application import catch_config_error, boolean_flag
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
add InlineBackend to ConsoleApp class list...
r7291 from IPython.frontend.consoleapp import IPythonConsoleApp
MinRK
define and test IPython.kernel public API
r9376 from IPython.kernel import swallow_argv
MinRK
mv IPython.zmq to IPython.kernel.zmq
r9372 from IPython.kernel.zmq.session import Session, default_secure
from IPython.kernel.zmq.zmqshell import ZMQInteractiveShell
from IPython.kernel.zmq.kernelapp import (
MinRK
move IPKernelApp from zmq.ipkernel to zmq.kernelapp...
r9357 kernel_flags,
kernel_aliases,
Brian E. Granger
Notebook app debugging....
r4345 IPKernelApp
)
Brian Granger
Refactoring notebook managers and adding Azure backed storage....
r8180 from IPython.utils.importstring import import_item
W. Trevor King
frontend.html.notebook: Use utils.localinterfaces.LOCALHOST
r9252 from IPython.utils.localinterfaces import LOCALHOST
Brian Granger
Refactoring notebook managers and adding Azure backed storage....
r8180 from IPython.utils.traitlets import (
Dict, Unicode, Integer, List, Enum, Bool,
DottedObjectName
)
MinRK
Ensure handler patterns are str, not unicode...
r6067 from IPython.utils import py3compat
MinRK
use FileFindHandler in NotebookApp...
r7923 from IPython.utils.path import filefind
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+)"
MinRK
add redirect handler for notebooks by name...
r10008 _notebook_name_regex = r"(?P<notebook_name>.+\.ipynb)"
MinRK
relax profile regex in notebook...
r7668 _profile_regex = r"(?P<profile>[^\/]+)" # there is almost no text that is invalid
Brian Granger
First version of cluster web service....
r6191 _cluster_action_regex = r"(?P<action>start|stop)"
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 #-----------------------------------------------------------------------------
Andrew Straw
allow setting base_project_url and base_kernel_url to non-default values
r6004 # Helper functions
#-----------------------------------------------------------------------------
def url_path_join(a,b):
if a.endswith('/') and b.startswith('/'):
return a[:-1]+b
else:
return a+b
Bradley M. Froehle
NotebookApp: Make the number of ports to retry user configurable....
r7234 def random_ports(port, n):
"""Generate a list of n random ports near the given port.
The first 5 ports will be sequential, and the remaining n-5 will be
randomly selected in the range [port-2*n, port+2*n].
"""
for i in range(min(5, n)):
yield port + i
for i in range(n-5):
yield port + random.randint(-2*n, 2*n)
Andrew Straw
allow setting base_project_url and base_kernel_url to non-default values
r6004 #-----------------------------------------------------------------------------
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
Matthias BUSSONNIER
remove trailing whitespace
r9284 def __init__(self, ipython_app, kernel_manager, notebook_manager,
Brian Granger
First version of cluster web service....
r6191 cluster_manager, log,
Andrew Straw
allow setting base_project_url and base_kernel_url to non-default values
r6004 base_project_url, settings_overrides):
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),
Stefan van der Walt
Add logout button.
r5325 (r"/logout", LogoutHandler),
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),
MinRK
add redirect handler for notebooks by name...
r10008 (r"/%s" % _notebook_name_regex, NotebookRedirectHandler),
Brian Granger
Beginning work on notebook duplication.
r5860 (r"/%s/copy" % _notebook_id_regex, NotebookCopyHandler),
Brian Granger
Created new print view for notebook printing.
r5875 (r"/%s/print" % _notebook_id_regex, PrintNotebookHandler),
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),
MinRK
serve files in notebook-dir as local/foo
r5823 (r"/rstservice/render", RSTHandler),
MinRK
serve local files as `files/foo`
r5826 (r"/files/(.*)", AuthenticatedFileHandler, {'path' : notebook_manager.notebook_dir}),
Brian Granger
First version of cluster web service....
r6191 (r"/clusters", MainClusterHandler),
(r"/clusters/%s/%s" % (_profile_regex, _cluster_action_regex), ClusterActionHandler),
(r"/clusters/%s" % _profile_regex, ClusterProfileHandler),
Brian E. Granger
Creating files to new notebook app.
r4339 ]
Timo Paulssen
use IPythons config subsystem to allow overrides to the tornado web app.
r5664
MinRK
Ensure handler patterns are str, not unicode...
r6067 # Python < 2.6.5 doesn't accept unicode keys in f(**kwargs), and
# base_project_url will always be unicode, which will in turn
# make the patterns unicode, and ultimately result in unicode
# keys in kwargs to handler._execute(**kwargs) in tornado.
# This enforces that base_project_url be ascii in that situation.
#
# Note that the URLs these patterns check against are escaped,
# and thus guaranteed to be ASCII: 'héllo' is really 'h%C3%A9llo'.
base_project_url = py3compat.unicode_to_str(base_project_url, 'ascii')
Matthias BUSSONNIER
allows password and prefix for notebook...
r7797 settings = dict(
template_path=os.path.join(os.path.dirname(__file__), "templates"),
MinRK
handle single static path in FileFindHandler
r7930 static_path=ipython_app.static_file_path,
MinRK
use FileFindHandler in NotebookApp...
r7923 static_handler_class = FileFindHandler,
Bussonnier Matthias
diverse fixes for project url...
r8938 static_url_prefix = url_path_join(base_project_url,'/static/'),
Matthias BUSSONNIER
allows password and prefix for notebook...
r7797 cookie_secret=os.urandom(1024),
Bussonnier Matthias
diverse fixes for project url...
r8938 login_url=url_path_join(base_project_url,'/login'),
Bradley M. Froehle
Notebook: Store the username in a cookie whose name is unique....
r8340 cookie_name='username-%s' % uuid.uuid4(),
MinRK
add redirect handler for notebooks by name...
r10008 base_project_url = base_project_url,
Matthias BUSSONNIER
allows password and prefix for notebook...
r7797 )
# allow custom overrides for the tornado web app.
settings.update(settings_overrides)
Andrew Straw
allow setting base_project_url and base_kernel_url to non-default values
r6004 # prepend base_project_url onto the patterns that we match
new_handlers = []
for handler in handlers:
pattern = url_path_join(base_project_url, handler[0])
new_handler = tuple([pattern]+list(handler[1:]))
new_handlers.append( new_handler )
super(NotebookWebApplication, self).__init__(new_handlers, **settings)
Brian E. Granger
Creating files to new notebook app.
r4339
Brian E. Granger
Major refactor of kernel connection management in the notebook....
r4545 self.kernel_manager = kernel_manager
Brian E. Granger
Adding kernel/notebook associations.
r4494 self.notebook_manager = notebook_manager
Brian Granger
First version of cluster web service....
r6191 self.cluster_manager = cluster_manager
Brian E. Granger
WebSocket url is now passed to browser when a kernel is started.
r4572 self.ipython_app = ipython_app
MinRK
move read_only flag to page-level...
r5213 self.read_only = self.ipython_app.read_only
Brian E. Granger
Creating application.config attribute....
r9114 self.config = self.ipython_app.config
Bussonnier Matthias
fix print css less
r9269 self.use_less = self.ipython_app.use_less
Brian Granger
First version of cluster web service....
r6191 self.log = log
Cameron Bates
Move environment setting from handler to the notebook application
r8840 self.jinja2_env = Environment(loader=FileSystemLoader(os.path.join(os.path.dirname(__file__), "templates")))
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
#-----------------------------------------------------------------------------
MinRK
move IPKernelApp from zmq.ipkernel to zmq.kernelapp...
r9357 flags = dict(kernel_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."
)
MinRK
allow the notebook to run without MathJax...
r5547 flags['no-mathjax']=(
{'NotebookApp' : {'enable_mathjax' : False}},
"""Disable MathJax
MathJax is the javascript library IPython uses to render math/LaTeX. It is
very large, so you may want to disable it if you have a slow internet
connection, or for offline use of the notebook.
When disabled, equations etc. will appear as their untransformed TeX source.
"""
)
MinRK
Allow notebook server to run in read-only mode...
r5191 flags['read-only'] = (
{'NotebookApp' : {'read_only' : True}},
MinRK
add read-only view for notebooks...
r5200 """Allow read-only access to notebooks.
When using a password to protect the notebook server, this flag
allows unauthenticated clients to view the notebook list, and
individual notebooks, but not edit them, start kernels, or run
code.
MinRK
allow fully read-only mode if no password is set
r5210 If no password is set, the server will be entirely read-only.
MinRK
add read-only view for notebooks...
r5200 """
MinRK
Allow notebook server to run in read-only mode...
r5191 )
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344
Fernando Perez
Define flags in application that's going to use them.
r5762 # Add notebook manager flags
Brian Granger
Fixing minor bugs in notebookapp related to base class name.
r8183 flags.update(boolean_flag('script', 'FileNotebookManager.save_script',
Fernando Perez
Define flags in application that's going to use them.
r5762 'Auto-save a .py script everytime the .ipynb notebook is saved',
'Do not auto-save .py scripts for every notebook'))
Fernando Perez
Add --script flag as shorthand for the script autosave notebook option.
r5758
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
Fernando Perez
Define flags in application that's going to use them.
r5762 notebook_flags = ['no-browser', 'no-mathjax', 'read-only', 'script', 'no-script']
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344
MinRK
move IPKernelApp from zmq.ipkernel to zmq.kernelapp...
r9357 aliases = dict(kernel_aliases)
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344
Brian E. Granger
Updating notebook configuration....
r4519 aliases.update({
Brian E. Granger
Misc changes to the notebook....
r5104 'ip': 'NotebookApp.ip',
'port': 'NotebookApp.port',
Bradley M. Froehle
NotebookApp: Make the number of ports to retry user configurable....
r7234 'port-retries': 'NotebookApp.port_retries',
MinRK
ip/transport live in KernelManager now...
r9177 'transport': 'KernelManager.transport',
Brian E. Granger
Misc changes to the notebook....
r5104 'keyfile': 'NotebookApp.keyfile',
'certfile': 'NotebookApp.certfile',
Brian Granger
Renaming BaseNotebookManager->NotebookManager to preserve config.
r8194 'notebook-dir': 'NotebookManager.notebook_dir',
Paul Ivanov
added --browser option to notebook...
r6116 'browser': 'NotebookApp.browser',
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)
Bradley M. Froehle
NotebookApp: Make the number of ports to retry user configurable....
r7234 notebook_aliases = [u'port', u'port-retries', u'ip', u'keyfile', u'certfile',
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
Brian Granger
Renaming BaseNotebookManager->NotebookManager to preserve config.
r8194 classes = IPythonConsoleApp.classes + [MappingKernelManager, NotebookManager,
Brian Granger
Fixing minor bugs in notebookapp related to base class name.
r8183 FileNotebookManager]
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.")
Paul Ivanov
set auto_create flag for notebook apps
r5847 # create requested profiles by default, if they don't exist:
auto_create = Bool(True)
Puneeth Chaganti
ENH: Open a notebook from the command line...
r6724 # file to be opened in the notebook server
file_to_run = Unicode('')
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''
MinRK
add Integer traitlet...
r5344 port = Integer(8888, config=True,
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344 help="The port the notebook server will listen on."
)
Bradley M. Froehle
NotebookApp: Make the number of ports to retry user configurable....
r7234 port_retries = Integer(50, config=True,
help="The number of additional ports to try if the specified port is not available."
)
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344
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,
Stefan van der Walt
Integrate hashed passwords into the notebook.
r5321 help="""Hashed password to use for web authentication.
Fernando Perez
Fix failing doctests and post correct example of passwd() usage.
r5337 To generate, type in a python/IPython shell:
Stefan van der Walt
Integrate hashed passwords into the notebook.
r5321
Fernando Perez
Fix failing doctests and post correct example of passwd() usage.
r5337 from IPython.lib import passwd; passwd()
Stefan van der Walt
Integrate hashed passwords into the notebook.
r5321
The string should be of the form type:salt:hashed-password.
"""
Satrajit Ghosh
enh: added authentication ability for webapp
r4690 )
Paul Ivanov
added --browser option to notebook...
r6116
Thomas Kluyver
Add ability to open the notebook in a browser when it starts.
r5065 open_browser = Bool(True, config=True,
Paul Ivanov
document how to select browser for notebook
r6115 help="""Whether to open in a browser after starting.
The specific browser used is platform dependent and
determined by the python standard library `webbrowser`
Paul Ivanov
added --browser option to notebook...
r6116 module, unless it is overridden using the --browser
(NotebookApp.browser) configuration option.
Paul Ivanov
document how to select browser for notebook
r6115 """)
Paul Ivanov
added --browser option to notebook...
r6116
browser = Unicode(u'', config=True,
Paul Ivanov
be more explicit about how --browser value is used
r6117 help="""Specify what command to use to invoke a web
browser when opening the notebook. If not specified, the
default browser will be determined by the `webbrowser`
standard library module, which allows setting of the
BROWSER environment variable to override it.
Paul Ivanov
added --browser option to notebook...
r6116 """)
MinRK
Allow notebook server to run in read-only mode...
r5191
read_only = Bool(False, config=True,
help="Whether to prevent editing/execution of notebooks."
)
Bussonnier Matthias
add less flag
r9266
Matthias BUSSONNIER
remove trailing whitespace
r9284 use_less = Bool(False, config=True,
Bussonnier Matthias
add less flag
r9266 help="""Wether to use Browser Side less-css parsing
Matthias BUSSONNIER
remove trailing whitespace
r9284 instead of compiled css version in templates that allows
it. This is mainly convenient when working on the less
Bussonnier Matthias
add less flag
r9266 file to avoid a build step, or if user want to overwrite
some of the less variables without having to recompile
Matthias BUSSONNIER
use less as a component
r9287 everything.
You will need to install the less.js component in the static directory
either in the source tree or in your profile folder.
""")
Matthias BUSSONNIER
remove trailing whitespace
r9284
Timo Paulssen
this is how the configuration system is supposed to be used.
r5665 webapp_settings = Dict(config=True,
help="Supply overrides for the tornado.web.Application that the "
"IPython notebook uses.")
MinRK
allow the notebook to run without MathJax...
r5547 enable_mathjax = Bool(True, config=True,
help="""Whether to enable MathJax for typesetting math/TeX
MathJax is the javascript library IPython uses to render math/LaTeX. It is
very large, so you may want to disable it if you have a slow internet
connection, or for offline use of the notebook.
When disabled, equations etc. will appear as their untransformed TeX source.
"""
)
MinRK
adjust missing mathjax handling per review...
r5557 def _enable_mathjax_changed(self, name, old, new):
"""set mathjax url to empty if mathjax is disabled"""
if not new:
self.mathjax_url = u''
Andrew Straw
let websocket server be traited config option
r6006
Andrew Straw
allow setting base_project_url and base_kernel_url to non-default values
r6004 base_project_url = Unicode('/', config=True,
Bussonnier Matthias
diverse fixes for project url...
r8938 help='''The base URL for the notebook server.
Leading and trailing slashes can be omitted,
and will automatically be added.
''')
def _base_project_url_changed(self, name, old, new):
if not new.startswith('/'):
self.base_project_url = '/'+new
elif not new.endswith('/'):
self.base_project_url = new+'/'
Andrew Straw
allow setting base_project_url and base_kernel_url to non-default values
r6004 base_kernel_url = Unicode('/', config=True,
Bussonnier Matthias
diverse fixes for project url...
r8938 help='''The base URL for the kernel server
Leading and trailing slashes can be omitted,
and will automatically be added.
''')
def _base_kernel_url_changed(self, name, old, new):
if not new.startswith('/'):
self.base_kernel_url = '/'+new
elif not new.endswith('/'):
self.base_kernel_url = new+'/'
Andrew Straw
let websocket server be traited config option
r6006 websocket_host = Unicode("", config=True,
help="""The hostname for the websocket server."""
)
Bussonnier Matthias
diverse fixes for project url...
r8938
MinRK
use FileFindHandler in NotebookApp...
r7923 extra_static_paths = List(Unicode, config=True,
help="""Extra paths to search for serving static files.
This allows adding javascript/css to be available from the notebook server machine,
or overriding individual files in the IPython"""
)
def _extra_static_paths_default(self):
return [os.path.join(self.profile_dir.location, 'static')]
@property
def static_file_path(self):
"""return extra paths + the default location"""
Thomas Kluyver
Simplify using notebook static files from external code.
r9681 return self.extra_static_paths + [DEFAULT_STATIC_FILES_PATH]
Andrew Straw
allow setting base_project_url and base_kernel_url to non-default values
r6004
MinRK
adjust missing mathjax handling per review...
r5557 mathjax_url = Unicode("", config=True,
help="""The url for MathJax.js."""
)
def _mathjax_url_default(self):
if not self.enable_mathjax:
return u''
Andrew Straw
use Tornado's handler.static_url() in templates
r6002 static_url_prefix = self.webapp_settings.get("static_url_prefix",
"/static/")
MinRK
use FileFindHandler in NotebookApp...
r7923 try:
MinRK
log local mathjax path
r8017 mathjax = filefind(os.path.join('mathjax', 'MathJax.js'), self.static_file_path)
MinRK
use FileFindHandler in NotebookApp...
r7923 except IOError:
MinRK
update with forthcoming MathJax CDN move
r6729 if self.certfile:
# HTTPS: load from Rackspace CDN, because SSL certificate requires it
base = u"https://c328740.ssl.cf1.rackcdn.com"
MinRK
load mathjax from CDN via https...
r6155 else:
MinRK
update with forthcoming MathJax CDN move
r6729 base = u"http://cdn.mathjax.org"
MinRK
load mathjax from CDN via https...
r6155
MinRK
update with forthcoming MathJax CDN move
r6729 url = base + u"/mathjax/latest/MathJax.js"
self.log.info("Using MathJax from CDN: %s", url)
return url
MinRK
use FileFindHandler in NotebookApp...
r7923 else:
MinRK
log local mathjax path
r8017 self.log.info("Using local MathJax from %s" % mathjax)
MinRK
use FileFindHandler in NotebookApp...
r7923 return static_url_prefix+u"mathjax/MathJax.js"
MinRK
adjust missing mathjax handling per review...
r5557
def _mathjax_url_changed(self, name, old, new):
if new and not self.enable_mathjax:
# enable_mathjax=False overrides mathjax_url
self.mathjax_url = u''
else:
self.log.info("Using MathJax: %s", new)
Satrajit Ghosh
enh: added authentication ability for webapp
r4690
Brian Granger
Fixing minor things for the Azure backed nb storage.
r8181 notebook_manager_class = DottedObjectName('IPython.frontend.html.notebook.filenbmanager.FileNotebookManager',
Brian Granger
Refactoring notebook managers and adding Azure backed storage....
r8180 config=True,
help='The notebook manager class to use.')
Alberto Valverde
Added trust_xheaders config option to delegate it to HTTPServer....
r10163 trust_xheaders = Bool(False, config=True,
help=("Whether to trust or not X-Scheme/X-Forwarded-Proto and X-Real-Ip/X-Forwarded-For headers"
"sent by the upstream reverse proxy. Neccesary if the proxy handles SSL")
)
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:]
MinRK
Split swallow_argv into standalone function in lib.kernel...
r5620 # Scrub frontend-specific flags
self.kernel_argv = swallow_argv(argv, notebook_aliases, notebook_flags)
Brian E. Granger
More review changes....
r4609 # Kernel should inherit default config file from frontend
MinRK
fix last remaining KernelApp reference
r9520 self.kernel_argv.append("--IPKernelApp.parent_appname='%s'" % self.name)
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344
Puneeth Chaganti
ENH: Open a notebook from the command line...
r6724 if self.extra_args:
MinRK
minor notebook-dir config adjustments...
r7556 f = os.path.abspath(self.extra_args[0])
if os.path.isdir(f):
nbdir = f
else:
self.file_to_run = f
nbdir = os.path.dirname(f)
Brian Granger
Renaming BaseNotebookManager->NotebookManager to preserve config.
r8194 self.config.NotebookManager.notebook_dir = nbdir
Puneeth Chaganti
ENH: Open a notebook from the command line...
r6724
Brian E. Granger
Adding kernel/notebook associations.
r4494 def init_configurables(self):
MinRK
enable HMAC message signing by default in notebook kernels...
r4963 # force Session default to be secure
default_secure(self.config)
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 )
Brian Granger
Refactoring notebook managers and adding Azure backed storage....
r8180 kls = import_item(self.notebook_manager_class)
self.notebook_manager = kls(config=self.config, log=self.log)
self.notebook_manager.load_notebook_names()
Brian Granger
First version of cluster web service....
r6191 self.cluster_manager = ClusterManager(config=self.config, log=self.log)
Brian Granger
Notebook cluster manager now uses proper launchers.
r6199 self.cluster_manager.update_profiles()
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):
# 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
cleanup connection files on notebook shutdown...
r5799
def init_webapp(self):
"""initialize tornado webapp and httpserver"""
Brian E. Granger
More work on updating the notebook zmq forwarding.
r4347 self.web_app = NotebookWebApplication(
Brian Granger
First version of cluster web service....
r6191 self, self.kernel_manager, self.notebook_manager,
self.cluster_manager, self.log,
Andrew Straw
allow setting base_project_url and base_kernel_url to non-default values
r6004 self.base_project_url, self.webapp_settings
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
Alberto Valverde
Added trust_xheaders config option to delegate it to HTTPServer....
r10163 self.http_server = httpserver.HTTPServer(self.web_app, ssl_options=ssl_options,
xheaders=self.trust_xheaders)
dkua
Refactored warning printout as per Issue #2244
r8723 if not self.ip:
dkua
Made some changes to message and logic as advised by Fernando.
r8724 warning = "WARNING: The notebook server is listening on all IP addresses"
dkua
Refactored warning printout as per Issue #2244
r8723 if ssl_options is None:
dkua
Made changes as per discussion in PR thread.
r8726 self.log.critical(warning + " and not using encryption. This"
"is not recommended.")
dkua
Made some changes to message and logic as advised by Fernando.
r8724 if not self.password and not self.read_only:
dkua
Made changes as per discussion in PR thread.
r8726 self.log.critical(warning + "and not using authentication."
"This is highly insecure and not recommended.")
Bradley M. Froehle
NotebookApp: Make the number of ports to retry user configurable....
r7234 success = None
for port in random_ports(self.port, self.port_retries+1):
Brian E. Granger
Autotry additional ports if 8888 if already in use.
r4548 try:
self.http_server.listen(port, self.ip)
Matthias BUSSONNIER
conform to pep 3110...
r7787 except socket.error as e:
Paul Ivanov
closes #3045, #3123 for tornado < version 3.0...
r10164 # XXX: remove the e.errno == -9 block when we require
# tornado >= 3.0
Paul Ivanov
addressing @minrk's PR feedback...
r10168 if e.errno == -9 and tornado.version_info[0] < 3:
Paul Ivanov
closes #3045, #3123 for tornado < version 3.0...
r10164 # The flags passed to socket.getaddrinfo from
# tornado.netutils.bind_sockets can cause "gaierror:
# [Errno -9] Address family for hostname not supported"
# when the interface is not associated, for example.
# Changing the flags to exclude socket.AI_ADDRCONFIG does
# not cause this error, but the only way to do this is to
# monkeypatch socket to remove the AI_ADDRCONFIG attribute
saved_AI_ADDRCONFIG = socket.AI_ADDRCONFIG
Paul Ivanov
addressing @minrk's PR feedback...
r10168 self.log.warn('Monkeypatching socket to fix tornado bug')
Paul Ivanov
closes #3045, #3123 for tornado < version 3.0...
r10164 del(socket.AI_ADDRCONFIG)
try:
# retry the tornado call without AI_ADDRCONFIG flags
self.http_server.listen(port, self.ip)
except socket.error as e2:
e = e2
else:
self.port = port
success = True
break
# restore the monekypatch
socket.AI_ADDRCONFIG = saved_AI_ADDRCONFIG
Brian E. Granger
Autotry additional ports if 8888 if already in use.
r4548 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
Bradley M. Froehle
NotebookApp: Make the number of ports to retry user configurable....
r7234 success = True
Brian E. Granger
Autotry additional ports if 8888 if already in use.
r4548 break
Bradley M. Froehle
NotebookApp: Make the number of ports to retry user configurable....
r7234 if not success:
self.log.critical('ERROR: the notebook server could not be started because '
'no available port could be found.')
Bradley M. Froehle
exit if server cannot start (instead of ugly traceback)
r7240 self.exit(1)
MinRK
cleanup connection files on notebook shutdown...
r5799
MinRK
exit notebook cleanly on SIGINT, SIGTERM...
r6498 def init_signal(self):
MinRK
remove workarounds for no-longer-supported pyzmq versions
r10200 if not sys.platform.startswith('win'):
MinRK
handle old pyzmq in notebook exit confirmation...
r6509 signal.signal(signal.SIGINT, self._handle_sigint)
MinRK
confirm notebook shutdown on SIGINT...
r6508 signal.signal(signal.SIGTERM, self._signal_stop)
Paul Ivanov
check for SIGUSR1 before using it, closes #3074...
r10031 if hasattr(signal, 'SIGUSR1'):
# Windows doesn't support SIGUSR1
signal.signal(signal.SIGUSR1, self._signal_info)
Paul Ivanov
make SIGUSR1 and SIGINFO trigger printing of info...
r9913 if hasattr(signal, 'SIGINFO'):
# only on BSD-based systems
signal.signal(signal.SIGINFO, self._signal_info)
MinRK
exit notebook cleanly on SIGINT, SIGTERM...
r6498
MinRK
confirm notebook shutdown on SIGINT...
r6508 def _handle_sigint(self, sig, frame):
"""SIGINT handler spawns confirmation dialog"""
# register more forceful signal handler for ^C^C case
signal.signal(signal.SIGINT, self._signal_stop)
# request confirmation dialog in bg thread, to avoid
# blocking the App
thread = threading.Thread(target=self._confirm_exit)
thread.daemon = True
thread.start()
def _restore_sigint_handler(self):
"""callback for restoring original SIGINT handler"""
signal.signal(signal.SIGINT, self._handle_sigint)
def _confirm_exit(self):
"""confirm shutdown on ^C
A second ^C, or answering 'y' within 5s will cause shutdown,
otherwise original SIGINT handler will be restored.
MinRK
disable ^C^C confirmation on Windows
r7689
This doesn't work on Windows.
MinRK
confirm notebook shutdown on SIGINT...
r6508 """
MinRK
handle old pyzmq in notebook exit confirmation...
r6509 # FIXME: remove this delay when pyzmq dependency is >= 2.1.11
time.sleep(0.1)
Paul Ivanov
log the notebook server directory...
r9912 info = self.log.info
info('interrupted')
Paul Ivanov
print info string on interrupt, log it on startup
r10019 print self.notebook_info()
sys.stdout.write("Shutdown this notebook server (y/[n])? ")
MinRK
confirm notebook shutdown on SIGINT...
r6508 sys.stdout.flush()
r,w,x = select.select([sys.stdin], [], [], 5)
if r:
line = sys.stdin.readline()
if line.lower().startswith('y'):
self.log.critical("Shutdown confirmed")
ioloop.IOLoop.instance().stop()
return
else:
print "No answer for 5s:",
print "resuming operation..."
# no answer, or answer is no:
# set it back to original SIGINT handler
# use IOLoop.add_callback because signal.signal must be called
# from main thread
ioloop.IOLoop.instance().add_callback(self._restore_sigint_handler)
def _signal_stop(self, sig, frame):
MinRK
exit notebook cleanly on SIGINT, SIGTERM...
r6498 self.log.critical("received signal %s, stopping", sig)
ioloop.IOLoop.instance().stop()
Paul Ivanov
make SIGUSR1 and SIGINFO trigger printing of info...
r9913
def _signal_info(self, sig, frame):
Paul Ivanov
print info string on interrupt, log it on startup
r10019 print self.notebook_info()
MinRK
exit notebook cleanly on SIGINT, SIGTERM...
r6498
MinRK
cleanup connection files on notebook shutdown...
r5799 @catch_config_error
def initialize(self, argv=None):
MinRK
move default log setup to _log_default from init_logging...
r6883 self.init_logging()
MinRK
cleanup connection files on notebook shutdown...
r5799 super(NotebookApp, self).initialize(argv)
self.init_configurables()
self.init_webapp()
MinRK
exit notebook cleanly on SIGINT, SIGTERM...
r6498 self.init_signal()
MinRK
cleanup connection files on notebook shutdown...
r5799
def cleanup_kernels(self):
Brian E. Granger
General cleanup of kernelmanger.MultiKernelManager.
r9112 """Shutdown all kernels.
MinRK
cleanup connection files on notebook shutdown...
r5799
The kernels will shutdown themselves when this process no longer exists,
but explicit shutdown allows the KernelManagers to cleanup the connection files.
"""
self.log.info('Shutting down kernels')
Brian E. Granger
General cleanup of kernelmanger.MultiKernelManager.
r9112 self.kernel_manager.shutdown_all()
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344
Paul Ivanov
print info string on interrupt, log it on startup
r10019 def notebook_info(self):
"Return the current working directory and the server url information"
mgr_info = self.notebook_manager.info_string() + "\n"
return mgr_info +"The IPython Notebook is running at: %s" % self._url
Paul Ivanov
log the notebook server directory...
r9912
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344 def start(self):
Paul Ivanov
on resume, print server info again...
r9910 """ Start the IPython Notebok server app, after initialization
This method takes no arguments so all configuration and initialization
must be done prior to calling this method."""
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'
Fernando Perez
Add message about how to stop the notebook.
r5786 info = self.log.info
Paul Ivanov
on resume, print server info again...
r9910 self._url = "%s://%s:%i%s" % (proto, ip, self.port,
self.base_project_url)
Paul Ivanov
print info string on interrupt, log it on startup
r10019 for line in self.notebook_info().split("\n"):
info(line)
Fernando Perez
Add message about how to stop the notebook.
r5786 info("Use Control-C to stop this server and shut down all kernels.")
MinRK
minor notebook-dir config adjustments...
r7556 if self.open_browser or self.file_to_run:
W. Trevor King
frontend.html.notebook: Use utils.localinterfaces.LOCALHOST
r9252 ip = self.ip or LOCALHOST
Bradley M. Froehle
notebook: Print a warning (but do not abort) if no webbrowser can be found....
r7658 try:
browser = webbrowser.get(self.browser or None)
except webbrowser.Error as e:
self.log.warn('No web browser found: %s.' % e)
browser = None
Puneeth Chaganti
ENH: Open a notebook from the command line...
r6724
if self.file_to_run:
Puneeth Chaganti
CLN: Use name to id mapping of notebooks instead of searching....
r8162 name, _ = os.path.splitext(os.path.basename(self.file_to_run))
url = self.notebook_manager.rev_mapping.get(name, '')
Puneeth Chaganti
ENH: Open a notebook from the command line...
r6724 else:
url = ''
Bradley M. Froehle
notebook: Print a warning (but do not abort) if no webbrowser can be found....
r7658 if browser:
b = lambda : browser.open("%s://%s:%i%s%s" % (proto, ip,
self.port, self.base_project_url, url), new=2)
threading.Thread(target=b).start()
MinRK
cleanup connection files on notebook shutdown...
r5799 try:
ioloop.IOLoop.instance().start()
except KeyboardInterrupt:
info("Interrupted...")
finally:
self.cleanup_kernels()
Brian E. Granger
Refactoring the notebook app to support the new config system.
r4344
#-----------------------------------------------------------------------------
# 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():
MinRK
cleanup connection files on notebook shutdown...
r5799 app = NotebookApp.instance()
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