http://www.perlmonks.org?node_id=1058901

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

Hi, I'm using Dancer2 (0.10) on Perl 5.16.3.

I manage to load Plack middlewares from app.pl, but not from the config.yml file.

*** In app.pl I have:

use Plack::Builder; builder { enable 'Debug', panels => [qw<Memory Timer>]; HabitLab->dance; };

which works perfectly.

*** Here is what i put in config.yml instead (and which doesn't work) :

layout: "main" plack_middlewares: - - Debug - panels - - Memory - Timer

I know that the config file is used, because my "main" layout is used. And I know that this YAML is valid, and produces the following structure (outputed with Data::Printer) :

\ { plack_middlewares [ [0] [ [0] "Debug", [1] "panels", [2] [ [0] "Memory", [1] "Timer", ] ] ] }

But the middleware doesn't work in this case. What have I missed?

I've followed the examples from here and there:

http://advent.perldancer.org/2011/16 http://search.cpan.org/dist/Dancer/lib/Dancer/Cookbook.pod#Plack_middl +ewares

Replies are listed 'Best First'.
Re: Plack middlewares not loaded from Dancer config ( Dancer2 is not Dancer)
by Anonymous Monk on Oct 22, 2013 at 00:43 UTC
      a simple ack/grep of Dancer and Dancer2 for "middlewares" and "Plack::Builder" shows Dancer2 doesn't try to load them or Builder, you have to use Plack::Builder in your app.psgi, say devapp.psgi ... :)

        Thanks a LOT!

        I was going to try it with a bare Dancer2 app, a few different middlewares, and share the code (which I don't know how to do properly - maybe a dedicated Git repo just for these tests). You've avoided me useless hours of work :-)

Re: Plack middlewares not loaded from Dancer config
by Anonymous Monk on Oct 20, 2013 at 01:33 UTC

    ... I know that the config file is used, because my "main" layout is used... But the middleware doesn't work in this case. What have I missed?

    You're probably not loading that configuration file, otherwise both should have worked .... unless you don't have Plack'et'all installed

    What kind of diagnostic messages did you get? When you turned on debugging/logging/verbosity?

      Hey, thank you for your input!

      I have just done additional tests:

      I have created and alternative layout with a different title, and when I change the name of the layout in config.yml, and then stop and restart plackup, the title is changed. So, I am sure that the configuration is loaded.

      I have stopped loading ANY middleware from bin/app.pl. And I load only one middleware from the config.yml file, a simple one:

      plack_middlewares: - - ETag
      Then I checked whether it worked, by doing a curl, and seeing if I got any ETag header (as presented here: http://advent.perldancer.org/2011/16). It didn't work.

      Plack, Plack::Middleware and Plack::Middleware::ETag are installed.

      Here is what I get in logs/development.log:

      [HabitLab:31431] core @2013-10-21 12:39:17> looking for get / in (eva +l 231) l. 2 [HabitLab:31431] core @2013-10-21 12:39:17> Entering hook core.app.be +fore_request in /home/user/.perlbrew/libs/perl-5.16.3@devel/lib/perl5 +/Dancer2/Core/Dispatcher.pm l. 77 [HabitLab:31431] core @2013-10-21 12:39:17> Entering hook core.app.af +ter_request in /home/user/.perlbrew/libs/perl-5.16.3@devel/lib/perl5/ +Dancer2/Core/Dispatcher.pm l. 132
      And the page gets loaded as it should. Simply, the plack middlewares don't work... while if I load them from bin/app.pl, then it all works.

      It is annoying for loading different middlewares in development or production: I have to use an if/else in app.pl... not really elegant nor nice to maintain.

      Any idea of how I could investigate further?

        Have you tried asking at #dancer or #plack at irc.perl.org? I got many answers to my Dancer related problems there. Posting the solution back here would be great for those not attending the channels regularly, too.
        لսႽ† ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ