How to reference url parameters on page load?

I’m interested in taking optional query parameters, and passing them to an LLM, and updating the ChatInterface.

For example:

https://localhost:3000/ ← no behavior, just renders ChatInterface
https://localhost:3000/?query=who+is+president ← executes the query, updates the ChatInterface

I cant quite figure out how to watch the location though…

    def run_after(*args, **kwargs):
        print(args)

    pn.state.param.watch(run_after, "location")

…I get:

Exception has occurred: ValueError
location parameter was not found in list of parameters of class _state

I’ve also tried the example

    widget = pn.widgets.FloatSlider(name='Slider', start=0, end=10)
    if pn.state.location:
        pn.state.location.sync(widget, {'value': 'slider_value'})

…but setting http://localhost:21000/app?slider_value=3 doesnt set the slider value.

What browser are you using? The latter example works for me:

import panel as pn

pn.extension(design='material', template='material')

pn.state.template.main_max_width = '768px'

widget = pn.widgets.FloatSlider(name='Slider', start=0, end=10)
widget2 = pn.widgets.TextInput(name='Text')
widget3 = pn.widgets.RangeSlider(name='RangeSlider', start=0, end=10)

if pn.state.location:
    pn.state.location.sync(widget, {'value': 'slider_value'})
    pn.state.location.sync(widget2, {'value': 'text_value'})
    pn.state.location.sync(widget3, {'value': 'range_value'})

pn.Column(widget, widget2, widget3).servable()

Hi @ahuang11 thanks for your reply, you are fast! I’m using Chrome.

One possible difference is I’m running pn.serve() vs servable(), passing in the template.

    APP_ROUTES = {"app": template}

    pn.serve(
        APP_ROUTES,
        title="title",
        port=port,
        ...<other config values>
    )

Does that make a difference?

1 Like

Potentially :slight_smile:
Are you able to try panel serve app.py?

You can additionally rely on the state property session_args that returns a dict of query parameters to their bytes-encoded values. It’s useful when you only need to catch the query parameters and not sync them. Search for session_args on these pages for more details:

Thanks @ahuang11 and @maximlt, it works using .servable() on a much smaller project mimicking your example, but fails with panel serve app.py on my project which uses serve(). state and session_args never seems to be populated, possibly I’m trying to access them in the wrong place. I’ll dig in a little further.

@justinwiley i’ve created examples, how to correct use pn.serve and get pn.state.location

import panel as pn

if 'page' in pn.state.location.query_params:
    page = pn.state.location.query_params['page']
else:
    page = 'home'

def view():
    return pn.pane.Markdown(f"# This is the {page} page")

if __name__ == '__main__':
    pn.serve(view)
AttributeError: 'NoneType' object has no attribute 'query_params'

Solution:

To fix the error, move any code that depends on pn.state.location inside the function passed to pn.serve(), ensuring it runs within the session context:

import panel as pn

def view():

    query_params = pn.state.location.query_params
    if 'page' in query_params:
        page = query_params['page']
    else:
        page = 'home'

    return pn.pane.Markdown(f"# This is the {page} page")

if __name__ == '__main__':
    pn.serve(view)

Now, if you navigate for example to /?page=example, you will get:
this is the example page