Hi, Just to share that I have successfully deployed Mojolicious (Full App) based BI application in production with Hynotoad along with Async/Await feature, DBIx:Class model layer, Mojo::Pg Model layer, API calls with Mojo::UserAgent (with Async/Await).
Mojo::Test feature is also amazing. Special thanks to Luc Didry for the following link which has helped me in deployment. https://mojolicious.io/blog/2018/12/22/use-carton-for-your-mojolicious-app-deployment/ -- Jeyaraj On Saturday, 6 June 2020 19:17:05 UTC+5:30, Jeyaraj Durairaj wrote: > > Honored to receive answers and responses from experts in the first place. > Your tips and ideas are indeed essential to me. > > Happy to be in Mojolicious discussions and sharing ideas! > > -- Jeyaraj > > On Saturday, 6 June 2020 19:11:47 UTC+5:30, Stefan Adams wrote: >> >> *form *and *json *are examples of "content generators >> <https://mojolicious.org/perldoc/Mojo/UserAgent/Transactor#GENERATORS>". >> You can think of them as request macros. *form >> <https://mojolicious.org/perldoc/Mojo/UserAgent/Transactor#form>*, for >> example, "generates query string, application/x-www-form-urlencoded or >> multipart/form-data content" while *json*, for example, "generates >> application/json content with Mojo::JSON." >> >> So, true, changing the content generator as I recommended changes how the >> request is sent to the server. But you can also create your own custom >> generators if you need to, such as an application/x-www-form-urlencoded >> content expecting a JSON value for a form parameter as yours seems to >> expect. >> >> Indeed, without knowing anything about your API, I recommended a change >> for how you send your request, completely blindly and contrary to what the >> API endpoint may be expecting. I assumed the API endpoint would handle a >> JSON request, but instead it seems to want a JSON string as the value to >> the *periods* parameter of the form. >> >> On Sat, Jun 6, 2020 at 5:50 AM Jeyaraj Durairaj <jeyaraj...@gmail.com> >> wrote: >> >>> Hi Stefan, >>> >>> Thanks for the appreciation and the ideas. >>> >>> I will surely do the following change in my code. >>> >>> changing to return *$tx->result->json*; from return >>> from_json($tx->result->body); >>> >>> However, following change has been tricky to me. >>> >>> changing to *json* => { periods => *$c->session('cx_current_quarter')* >>> }, from form => { periods => encode_json([ >>> $c->session('cx_current_quarter') >>> ]) }, >>> >>> I, per se, tried *json* => { periods => >>> *$c->session('cx_current_quarter')* } at the outset. It did not work. >>> >>> The reason I found is the following: >>> >>> "json =>" works for the API call without "Authorization Header" >>> my $tx = await $ua->post_p('http://' . $c->config->{API_IP} . >>> '/api/token/refresh/' => json => { refresh => $refresh_token }); >>> >>> only "form =>" works for the API call with Authorization Header" >>> $tx = await $ua->post_p( >>> 'http://' . $c->config->{API_IP} . >>> '/api-app/analytics/summary/', >>> { Authorization => 'Bearer ' . $access_token }, >>> *form *=> { periods => *$c->session('cx_current_quarter')* >>> }, >>> ); >>> >>> The difference between json and form in this context was intentional or >>> accidental. More comments on this will be appreciated! >>> >>> Thanks. >>> -- Jeyaraj >>> >>> >>> >>> On Saturday, 6 June 2020 02:55:04 UTC+5:30, Stefan Adams wrote: >>>> >>>> Great job pushing your application forward with Async/Await! Looking >>>> at your snippet, here's one small change you can probably make using the >>>> json() >>>> method from Mojo::Message >>>> <https://mojolicious.org/perldoc/Mojo/Message#json>: >>>> >>>> $app->helper(summary_data => async sub ($c, $access_token) { >>>> my $ua = Mojo::UserAgent->new; >>>> >>>> my $tx = await $ua->post_p( >>>> 'http://' . $c->config->{API_IP} . >>>> '/api-app/analytics/summary/', >>>> { Authorization => 'Bearer ' . $access_token }, >>>> *json* => { periods => *$c->session('cx_current_quarter')* >>>> }, >>>> ); >>>> if ($tx->result->is_success) { >>>> return *$tx->result->json*; >>>> } >>>> $c->flash(message_type => 'warning'); >>>> $c->flash(message => 'Could not get summary data'); >>>> return $c->redirect_to('cx-summary', status => 403); >>>> }); >>>> >>>> >>>> >>>> On Thu, Jun 4, 2020 at 2:31 AM Jeyaraj Durairaj <jeyaraj...@gmail.com> >>>> wrote: >>>> >>>>> Hi, >>>>> >>>>> It works for *helpers* as well with the following declaration. >>>>> >>>>> $app->helper(summary_data => async sub ($c, $access_token) { >>>>> my $ua = Mojo::UserAgent->new; >>>>> >>>>> my $tx = await $ua->post_p( >>>>> 'http://' . $c->config->{API_IP} . >>>>> '/api-app/analytics/summary/', >>>>> { Authorization => 'Bearer ' . $access_token }, >>>>> form => { periods => encode_json([ >>>>> $c->session('cx_current_quarter') ]) }, >>>>> ); >>>>> if ($tx->result->is_success) { >>>>> return from_json($tx->result->body); >>>>> } >>>>> $c->flash(message_type => 'warning'); >>>>> $c->flash(message => 'Could not get summary data'); >>>>> return $c->redirect_to('cx-summary', status => 403); >>>>> }); >>>>> >>>>> >>>>> >>>>> >>>>> -- Jeyaraj >>>>> >>>>> On Thursday, 4 June 2020 12:06:01 UTC+5:30, Jeyaraj Durairaj wrote: >>>>>> >>>>>> Hi, >>>>>> >>>>>> Eureka! Eureka! It works!. >>>>>> >>>>>> The solution I found (because of my error) is that I uninstalled >>>>>> Mojo::AsyncAwait and installed Future::AsyncAwait. >>>>>> It just works! >>>>>> >>>>>> By June end, my business intelligence application will be live to >>>>>> serve 100+ users with insights and analytics. >>>>>> >>>>>> (To apply icing on the cake, I have plugged in Moose also in to model >>>>>> layer for my application) >>>>>> >>>>>> As Glen Hinkle said, it is really really a fun to work in >>>>>> Mojolicious. I love Hypnotoad. >>>>>> >>>>>> BTW, I am doing a private project as well to help a home designer to >>>>>> launch a web site for their small firm. Guess! what framework I am gonna >>>>>> use.. *Mojolicious.* >>>>>> >>>>>> Thanks to Mojo group and special thanks to SRI as well. >>>>>> >>>>>> -- Jeyaraj >>>>>> >>>>>> >>>>>> >>>>>> On Thursday, 28 May 2020 14:15:04 UTC+5:30, Jeyaraj Durairaj wrote: >>>>>>> >>>>>>> any luck on the solutions? >>>>>>> >>>>>>> -- Jeyaraj >>>>>>> >>>>>>> On Thursday, 28 May 2020 00:10:48 UTC+5:30, Jeyaraj Durairaj wrote: >>>>>>>> >>>>>>>> However, the below code perfectly work for me outside Mojolicious >>>>>>>> App. >>>>>>>> >>>>>>>> >>>>>>>> use Modern::Perl; >>>>>>>> use Mojo::Base -strict, -signatures; >>>>>>>> use Mojo::UserAgent; >>>>>>>> use Mojo::Promise; >>>>>>>> use Mojo::IOLoop; >>>>>>>> use Mojo::Util 'trim'; >>>>>>>> use Mojo::AsyncAwait; >>>>>>>> use LWP::UserAgent; >>>>>>>> use JSON; >>>>>>>> >>>>>>>> >>>>>>>> my $ua = Mojo::UserAgent->new; >>>>>>>> my $result = $ua->post('http://localhost:8000/api/token/' => json >>>>>>>> => { username => 'username', password => 'mypassword' }) >>>>>>>> ->result >>>>>>>> ->json; >>>>>>>> my $access_token = $result->{access}; >>>>>>>> my $refresh_token = $result->{refresh}; >>>>>>>> print "Access Token: " . $result->{access}, "\n"; >>>>>>>> print "Refresh Token: " . $result->{refresh}, "\n\n"; >>>>>>>> >>>>>>>> >>>>>>>> $ua = Mojo::UserAgent->new; >>>>>>>> $result = $ua->post('http://' . 'localhost:8000' . >>>>>>>> '/api/token/refresh/' => json => { refresh => $refresh_token }) >>>>>>>> ->result >>>>>>>> ->json; >>>>>>>> >>>>>>>> >>>>>>>> my $agent = Mojo::UserAgent->new; >>>>>>>> async post_user_p => sub ($url) { >>>>>>>> say "\n\n", $url; >>>>>>>> my $tx = await $agent->post_p( >>>>>>>> $url, >>>>>>>> { >>>>>>>> Authorization => 'Bearer ' . $result->{access}, >>>>>>>> }, >>>>>>>> form => {"username" => "username"}, >>>>>>>> >>>>>>>> ); >>>>>>>> return trim from_json($tx->result->body)->{first_name}; >>>>>>>> }; >>>>>>>> >>>>>>>> async main => sub (@urls) { >>>>>>>> my @promises = map { post_user_p($_) } @urls; >>>>>>>> my @names = await Mojo::Promise->all(@promises); >>>>>>>> say for map { $_->[0] } @names; >>>>>>>> }; >>>>>>>> >>>>>>>> my @urls = (qw( >>>>>>>> http://localhost:8000/api-converge/auth/user/ >>>>>>>> )); >>>>>>>> >>>>>>>> main(@urls)->wait; >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> On Wednesday, 27 May 2020 23:41:27 UTC+5:30, Jeyaraj Durairaj wrote: >>>>>>>>> >>>>>>>>> I tried generating an example app and copied pasted the code >>>>>>>>> segment you posted here and then tried. >>>>>>>>> >>>>>>>>> "Action not found!" error is shown. >>>>>>>>> >>>>>>>>> Should I reinstall Perl again and then try? >>>>>>>>> Will it work under morbo or works only on Hypnotoad? >>>>>>>>> I am using Windows for my development, wherein morbo is the only >>>>>>>>> server I can test. >>>>>>>>> Or can I test it on daemon mode and try> >>>>>>>>> Please suggest as to how I should diagnose it. >>>>>>>>> I would need this Async/await to be working in my system. >>>>>>>>> I have tried without Async, all other functionalities rock both in >>>>>>>>> development and production (hypnotoad). Mojo::UserAgent is amazing to >>>>>>>>> fetch >>>>>>>>> API call data from Django server (running under Apache). >>>>>>>>> >>>>>>>>> I am completely counting on Mojolicious as my primary framework >>>>>>>>> for my new projects. Please help. >>>>>>>>> >>>>>>>>> >>>>>>>>> Regards/Jeyaraj >>>>>>>>> >>>>>>>>> On Wednesday, 27 May 2020 17:46:49 UTC+5:30, Sebastian Riedel >>>>>>>>> wrote: >>>>>>>>>> >>>>>>>>>> I'll assume it was you who asked the same question on IRC >>>>>>>>>> earlier. Had you been sticking around for a bit longer you would >>>>>>>>>> have seen >>>>>>>>>> my instructions for getting a working application that i tested >>>>>>>>>> locally. >>>>>>>>>> >>>>>>>>>> 14:08 <kraih> to be sure i did a "mojo generate app" and then >>>>>>>>>> replaced the controller with http://paste.scsys.co.uk/589044 >>>>>>>>>> >>>>>>>>>> That's the important part, if that doesn't work your Perl or some >>>>>>>>>> module you installed is broken. >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> sebastian >>>>>>>>>> >>>>>>>>> -- >>>>> You received this message because you are subscribed to the Google >>>>> Groups "Mojolicious" group. >>>>> To unsubscribe from this group and stop receiving emails from it, send >>>>> an email to mojol...@googlegroups.com. >>>>> To view this discussion on the web visit >>>>> https://groups.google.com/d/msgid/mojolicious/debdea2d-2f67-4feb-814d-9d936d1b6732%40googlegroups.com >>>>> >>>>> <https://groups.google.com/d/msgid/mojolicious/debdea2d-2f67-4feb-814d-9d936d1b6732%40googlegroups.com?utm_medium=email&utm_source=footer> >>>>> . >>>>> >>>> -- >>> You received this message because you are subscribed to the Google >>> Groups "Mojolicious" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to mojol...@googlegroups.com. >>> To view this discussion on the web visit >>> https://groups.google.com/d/msgid/mojolicious/ae2e9c20-e50a-4b67-a7a2-b103d7d8b728o%40googlegroups.com >>> >>> <https://groups.google.com/d/msgid/mojolicious/ae2e9c20-e50a-4b67-a7a2-b103d7d8b728o%40googlegroups.com?utm_medium=email&utm_source=footer> >>> . >>> >> -- You received this message because you are subscribed to the Google Groups "Mojolicious" group. To unsubscribe from this group and stop receiving emails from it, send an email to mojolicious+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/mojolicious/362836a1-e4d8-4f22-81e8-266a353ede8ao%40googlegroups.com.