Session-based flask app with session-id in url

I’m probably mixing thing up but here’s what I’m trying to do:
I have a dash app that has some session-id stored inside a dcc.Store.
This session-id is used as a lookup in a global dictionary that stores user data.
I’d like to have this session-id inside the URL so that a user can e.g. set a bookmark to recover his/her data later.
For this, I’d need a routing rule that takes the session-id in the URL and passes it to the dcc.Store.
Is this possible or … what would be an approach to achieve something like this?

Hello @luggie

I believe this is possible by using the Input(‘url’, ‘pathname’) inside the callback that returns your page’s layout.

from dash import Dash, html, dcc, State,Input, Output

app = Dash(__name__)

app.layout = html.Div([html.Div([], id='pageContent'), dcc.Store(id='sessionStore', storage_type='local'),

def myLayout(inPath=False, sessionID=None):
    if inPath:
        if sessionID:
             return html.Div(f'welcome back {sessionID}')
    elif sessionID:
        return html.Div(f'welcome back {sessionID}, to return to this page use:{sessionID}')
    return html.Div("it doesn't look like we've met")

    Output('pageContent', 'children'),
    Input('url', 'pathname'),
    State('sessionStore', 'data'),
def display_page(pathname, sessionID):
    if 'customData' in pathname:
            sessionID = pathname.split('customData/')[1]
            return myLayout(True, sessionID), sessionID
            return myLayout(False, sessionID), sessionID
    return myLayout(), ''

if __name__ == '__main__':
    app.run_server(host='', port=8050, debug=True)

I am assuming that you are using some sort of callback to set the session-id into the store, in this case you would have a conflict on outputs.

Now, as far as is it a good idea, I would say no. Because you could allow for other people to pull that person’s custom data with just a url string.

1 Like

thanks! For my use case it would be perfectly OK in terms of security to have the user’s data exposed via url string