Jupyterlab as an engineering blog server - Part 1

November 02, 2018


This blog is powered by enaml-web and Jupyterlab as an admin backend. Jupyterlab happens to be great for doing everything, including writing and previewing markdown as well as testing any code you have.


So how does it work? Simple, jupyterlab's backend is tornado, a simple pip install jupyterlab get's jupyterlab and it's dependencies installed. But by default Jupyterlab launches to Jupyterlab itself, so to customize it we'll have to use the jupyterlab_server to add hooks in to have it display our pages.


As the docs explain, just subclass the LabServerApp then we can hook in with our own request handlers. For example:


import tornado.web
from jupyter_server.app import LabServerApp


class HomeHandler(tornado.web.RequestHandler):
    def get(self):
        # Whatever you want the home page to be
        self.write("Hello, world")

class CustomApp(LabServerApp):

    def start(self):
        self.init_site()
        super(CustomApp, self).start()

    def init_site(self):
        # Add tornado handlers here
        custom_handlers = [
            (r"/", HomeHandler),
            # And others etc..
        ]
        self.web_app.add_handlers('.*$', custom_handlers)



Where custom_handlers is a list of urls and RequestHandlers like you would pass to any other tornado Application.


Just doing this however, Jupyterlab will still redirect to the lab application, but we can change that too. The easiest method I've found is just to pass the configuration directly to the launch_instance call like this:


import os
from app import CustomApp

def main():    
    CustomApp.launch_instance(
        # Whatever your server port needs to be
        port=8888, 
        # Listen on all ports
        ip='*', 
        # Where you want jupyterlab to be
        base_url='/jupyterlab/',  
        notebook_dir='data/',
        debug=False,
        open_browser=False,
        # Set the hashed password
        password=os.environ.get('HASHED_PWD')
    )

if __name__ == '__main__':
    main()


You'll want to create the HASHED_PWD by using



from notebook.auth import passwd
passwd()



Then just run that file using however you like to deply stuff

Note: I highly recommend running in a container like docker


At some point, I'll cover how the enaml-web stuff works, for now, enjoy go give Jupyterlab a try!


What other blog admins have tabs, split panes, and full IPython access? None that I know of, it's great!


Updated to correct hashed passwd usage