病みつきエンジニアブログ

機械学習、Python、Scala、JavaScript、などなど

保存できないけどread-onlyではないJupyter Notebookサーバーを立ち上げる

誰でも触れる、かつ、誰でもパラメータ変更できる、けど保存はしないでほしいJupyter(a.k.a IPython) Notebookサーバー作りたいことってあるじゃないですか。

例えば、社内のMySQLサーバーとかHadoop環境とかのクエリを叩けるようなJupyter Notebookを作ったとき。 誰でもクエリの内容は変えられていいけど、それが保存されると、他の人が叩くときに困る。 こんな感じ↓

f:id:yamitzky:20151204192809p:plain

configを変更する

Jupyterの場合は「~/.jupyter/jupyter_notebook_config.py」の設定ファイルに、次のような設定を加えます。

import notebook
from tornado import web

class FreezeFileContentsManager(notebook.services.contents.filemanager.FileContentsManager):
    def save(self, model, path=''):
        raise web.HTTPError(400, "You cannot save notebook on this server.")

c.NotebookApp.contents_manager_class = FreezeFileContentsManager

FreezeFileContentsManagerというふうにファイルマネージャーを自分で定義することによって、処理を乗っ取ることができます。 この場合は、saveの処理を上書きしています。

元になっているFileContentsManagerのコードはこちら。他にもいろいろoverrideすれば、処理を変えられそうです。

github.com

アウトプット変更とかだけだったら、 pre_save_hookを変更するのが良いかと思います。(参考)