jupyter-server / jupyter_server

The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications.
https://jupyter-server.readthedocs.io
BSD 3-Clause "New" or "Revised" License
486 stars 301 forks source link

ExtensionApp not compatible with extending ServerApp #395

Open minrk opened 3 years ago

minrk commented 3 years ago

I'm investigating https://github.com/jupyterlab/jupyterlab/issues/8807 and discovered that what should work:

from jupyterhub.singleuser import make_singleuser_app
from jupyterlab.labapp import LabApp
app = make_singleuser_app(LabApp)

doesn't. The immediate failure is:

AttributeError: 'LabApp' object has no attribute 'login_handler_class'

The underlying cause is that make_singleuser_app expects either the old NotebookApp or the new ServerApp, but LabApp is actually an ExtensionApp, which has a ServerApp rather than is a ServerApp. The underlying ServerApp class is not accessible (it is hardcoded to ServerApp), and thus not really extensible via normal means. This makes wrapping it not really feasible. Since LabApp is an app that launches a server, it seems like it should really be a ServerApp.

What's the best way to make LabApp or similar applications that really are server applications really extend ServerApp instead of this ExtensionApp wrapper? It seems like ExtensionApp should really subclass ServerApp and call super instead of initializing two global Application instances.

jasongrout commented 3 years ago

I'm curious about this answer too. It's been a bit confusing that we've moved from being a subclass to having an attribute. Is it so that the ExtensionApp can support having either a NotebookApp or a ServerApp attribute to aid in the transition?

jasongrout commented 3 years ago

The notes for today's jupyter server meeting have an excellent exposition on this topic: https://github.com/jupyter-server/team-compass/issues/4#issuecomment-769277987

Thanks for the explanation!