diff --git a/docs/source/howto/configuration/config-user-env.md b/docs/source/howto/configuration/config-user-env.md index ac089abe..39b2f2da 100644 --- a/docs/source/howto/configuration/config-user-env.md +++ b/docs/source/howto/configuration/config-user-env.md @@ -212,13 +212,31 @@ By default, the single-user server launches JupyterLab, which is based on [Jupyter Server][]. This is the default server when running JupyterHub ≥ 2.0. -To switch to using the legacy Jupyter Notebook server, you can set the `JUPYTERHUB_SINGLEUSER_APP` environment variable +To switch to using the legacy Jupyter Notebook server (notebook < 7.0), you can set the `JUPYTERHUB_SINGLEUSER_APP` environment variable (in the single-user environment) to: ```bash export JUPYTERHUB_SINGLEUSER_APP='notebook.notebookapp.NotebookApp' ``` +:::{note} + +``` +JUPYTERHUB_SINGLEUSER_APP='notebook.notebookapp.NotebookApp' +``` + +is only valid for notebook < 7. notebook v7 is based on jupyter-server, +and the default jupyter-server application must be used. +Selecting the new notebook UI is no longer a matter of selecting the server app to launch, +but only the default URL for users to visit. +To use notebook v7 with JupyterHub, leave the default singleuser app config alone (or specify `JUPYTERHUB_SINGLEUSER_APP=jupyter-server`) and set the default _URL_ for user servers: + +```python +c.Spawner.default_url = '/tree/' +``` + +::: + [jupyter server]: https://jupyter-server.readthedocs.io [jupyter notebook]: https://jupyter-notebook.readthedocs.io diff --git a/jupyterhub/singleuser/app.py b/jupyterhub/singleuser/app.py index c4425420..818ff51a 100644 --- a/jupyterhub/singleuser/app.py +++ b/jupyterhub/singleuser/app.py @@ -6,7 +6,7 @@ .. versionchanged:: 2.0 Default app changed to launch `jupyter labhub`. - Use JUPYTERHUB_SINGLEUSER_APP=notebook.notebookapp.NotebookApp for the legacy 'classic' notebook server. + Use JUPYTERHUB_SINGLEUSER_APP='notebook' for the legacy 'classic' notebook server (requires notebook<7). """ import os @@ -27,7 +27,25 @@ JUPYTERHUB_SINGLEUSER_APP = _app_shortcuts.get( JUPYTERHUB_SINGLEUSER_APP.replace("_", "-"), JUPYTERHUB_SINGLEUSER_APP ) + if JUPYTERHUB_SINGLEUSER_APP: + if JUPYTERHUB_SINGLEUSER_APP in {"notebook", _app_shortcuts["notebook"]}: + # better error for notebook v7, which uses jupyter-server + # when the legacy notebook server is requested + try: + from notebook import __version__ + except ImportError: + # will raise later + pass + else: + # check if this failed because of notebook v7 + _notebook_major_version = int(__version__.split(".", 1)[0]) + if _notebook_major_version >= 7: + raise ImportError( + f"JUPYTERHUB_SINGLEUSER_APP={JUPYTERHUB_SINGLEUSER_APP} is not valid with notebook>=7 (have notebook=={__version__}).\n" + f"Leave $JUPYTERHUB_SINGLEUSER_APP unspecified (or use the default JUPYTERHUB_SINGLEUSER_APP=jupyter-server), " + 'and set `c.Spawner.default_url = "/tree"` to make notebook v7 the default UI.' + ) App = import_item(JUPYTERHUB_SINGLEUSER_APP) else: App = None