notebook server支持notebook file的转换,打包,下载与部署的bundler extensions的自定义,此时你仅仅需要写一个Python函数就能实现一个bundler。notebook server会自动在notebook前端生成File- >Download 或者 File- >Deploy 菜单项。

要实现一个bundler extension,你必须完成下面的步骤:

  • 在python包内声明bundler extension metadata

  • 定义响应bundle requests的bundle函数

  • 指导用户如何enable/disable你的bundler extension

声明bundler metadata

你可以通过实现jupyter_bundlerextensions_paths函数提供bundler extension的信息。

# in mypackage.hello_bundler

def _jupyter_bundlerextension_paths():
    """Example "hello world" bundler extension"""
    return [{
        'name': 'hello_bundler',                    # unique bundler name
        'label': 'Hello Bundler',                   # human-redable menu item label
        'module_name': 'mypackage.hello_bundler',   # module containing bundle()
        'group': 'deploy'                           # group under 'deploy' or 'download' menu
    }]

注意函数的返回值是list,在list中可以返回多个dict。

定义bundler函数

菜单项最后是位于File->Deploy as 或者是 File->Download as 取决于metadata声明中的group 值。当用户点击菜单项时,就会触发module_name 中的bundle函数。

# in mypackage.hello_bundler

def bundle(handler, model):
    """Transform, convert, bundle, etc. the notebook referenced by the given
    model.

    Then issue a Tornado web response using the `handler` to redirect
    the user's browser, download a file, show a HTML page, etc. This function
    must finish the handler response before returning either explicitly or by
    raising an exception.

    Parameters
    ----------
    handler : tornado.web.RequestHandler
        Handler that serviced the bundle request
    model : dict
        Notebook model from the configured ContentManager
    """
    handler.finish('I bundled {}!'.format(model['path']))

bundler函数可以通过@tornado.gen.coroutine装饰

from tornado import gen

@gen.coroutine
def bundle(handler, model):
  # simulate a long running IO op (e.g., deploying to a remote host)
  yield gen.sleep(10)

  # now respond
  handler.finish('I spent 10 seconds bundling {}!'.format(model['path']))

上述方式是异步处理方式,当操作过程是一个耗时操作时,最好选择异步操作。

Enable/disable bundler extensions

notebook server包含enable/disable bundler extension的CLI

jupyter bundlerextension enable --py mypackage.hello_bundler --sys-prefix

上面命令会修改conda/virtualenv环境的notebook配置(sys-prefix)

jupyter bundlerextension disable --py mypackage.hello_bundler --sys-prefix

若要了解更多的bundlerextension的用法,可以使用:

jupyter bundlerextension --help

实例:IPython Notebook bundle (.zip)

可以在/opt/anaconda2/lib/python2.7/site-packages/notebook/bundler 查看zip_bundler.py和tarball_bundler.py

jupyter bundlerextension enable --py notebook.bundler.zip_bundler --sys-prefix
jupyter bundlerextension enable --py notebook.bundler.tarball_bundler --sys-prefix

Bundler触发详情

支持bundler extensions的python modules位于notebook/bundler ,而js则位于notebook/static/notebook/js/menubar.js 基本流程如下:

  1. 用户打开notebook文档
  2. Notebook前端js加载notebook配置
  3. Bundler前端js创建bundler extension的菜单项
  4. 用户单击bundler菜单项
  5. JS的click handler将打开浏览器 窗口/tab到<notebook base_url>/bundle/<path/to/notebook>?bundler=<name>
  6. Bundler handler验证notebook路径和bundler名称
  7. Bundler handler将请求转交给bundler函数
  8. bundler函数完成HTTP请求

results matching ""

    No results matching ""