Defer Callbacks Until Load#

This guide addresses how to set up callbacks to defer a task until the application is loaded.


Using the onload callback, we can trigger execution when a session is first initialized in a server context. An example of when this could be a helpful strategy is when we have to fetch something from some database, like the options that will go into a selection widget. Since this operation might take some time, we can quickly render something on the screen for the user to look at while the onload callback is continuing to fetch the options in the background.

Let us for example define a minimal example inside a function which we could pass to pn.serve (this emulates what happens when we call panel serve on the command line). In this example, we will create a widget without populating its options, then we will add an onload callback, which will set the options once the initial page is loaded.

import time
import panel as pn

pn.extension()

def app():
    widget = pn.widgets.Select()

    def on_load():
        time.sleep(2) # Emulate some long running process
        widget.options = ['A', 'B', 'C']

    pn.state.onload(on_load)

    return widget

# pn.serve(app) # launches the app

Alternatively, we may also use the defer_load argument to wait to evaluate a function until the page is loaded. In a situation where page loading takes some time, a placeholder and the global config.loading_spinner will be displayed.

def render_on_load():
    return pn.widgets.Select(options=['A', 'B', 'C'])

pn.Row(pn.panel(render_on_load, defer_load=True))