bartrad has asked for the wisdom of the Perl Monks concerning the following question:

Evening monks, I'm after some of your wisdom.

I have a Mojolicious lite app that works as I would expect for a single user. However, if two users are accessing it at the same time, the value of $router is changing depending on who submitted the request last.

For example, if user A submits the form to query 'RouterA' then the information is displayed for that router. However, when user B then submits the form to query 'RouterB', the session for user A and user B displays the information for 'RouterB'. I figure it must be since I am declaring $router (and other things) globally but I'm not sure how to store this and pass it around the different routes I have...

my ( $router, $cfg, $ip ); get '/' => sub { my $c = shift; $c->render( template => 'index' ); }; post '/' => sub { my $c = shift; ($router) = $c->param('router'); app->log->info("Router $router"); $cfg = get_config($router); $ip = $cfg->get_ip(); $c->render( template => 'result', router => $router, ip => $ip, ); } => 'index'; get '/info' => sub { my $c = shift; $c->render( template => 'result', router => $router, ip => $ip, ); }; get '/cards' => sub { my $c = shift; my %cards = $cfg->get_cards(); $c->render( template => 'cards', router => $router, cards => \%cards + ); }; app->start;

The reason I have globally declared the variables is so I can pass them between the different routes and have the value of $router preserved and displayed on each resultant HTML page. Any help greatly appreciated as I'm scratching my head with this one!

Replies are listed 'Best First'.
Re: Mojolicious global variable
by trippledubs (Deacon) on Dec 13, 2018 at 20:19 UTC
    If you're using a variable across more than one route, but not globally across the whole application, it needs to go into a user cookie or saved per session. You currently have one global across the whole app.
    # Validate $c->param('router') $c->session->{$router} = $c->param('router'); # In other routes my $router = $c->session->{$router} // $c->stash( router => $GLOBAL_DE +FAULT_ROUTER );