<div dir="ltr"><div><div><div><div><div>Hi everyone<br><br>I&#39;ve reverted my app mentioned in my previous post from Dancer2 back to Dancer 1.3111.<br><br></div>This time, an error is shown, but I have no clue what the problem is.<br>
<br>[hit #2]request to GET /panel/login crashed: Can&#39;t call method &quot;id&quot; without a package or object reference at /usr/lib/perl5/site_perl/5.12.3/Dancer/Session.pm line 36, &lt;DATA&gt; line 16. in /usr/lib/perl5/site_perl/5.12.3/Dancer/Handler.pm l. 98<br>
<br>This app works without error using the Simple, YAML and JSON session engines, but fails with Memcached. I know the Memcached instance is working as per my previous post, as accessing it with a regular perl script using Cache::Memcached works.<br>
<br></div><div>It seems either something&#39;s amiss with my Memcached instance, which the test script doesn&#39;t pick up, or there&#39;s a bug in Dancer::Session::Memcached?<br><br></div><div>Any pointers would be appreciated. Info follows.<br>
</div><div><br>config.yaml:<br><br>session: &quot;memcached&quot;<br>memcached_servers: &quot;/srv/web/app/sock/sessions.sock&quot;<br></div><div>session_timeout: 10<br></div><div><br></div>running the app as the same user owning the socket above.<br>
<br></div>./bin/<a href="http://app.pl">app.pl</a><br><br></div>==== <a href="http://app.pl">app.pl</a> ====<br><br>#!/usr/bin/env perl<br>use Dancer;<br>use app;<br>start;<br><br></div>==== lib/<a href="http://app.pm">app.pm</a> ====<br>
<br><div><div><div>package app;<br>use Dancer &#39;:syntax&#39;;<br>use Dancer::Session::Memcached;<br>use Authen::Simple::Passwd;<br><br>our $VERSION = &#39;0.2&#39;;<br><br>hook &#39;before&#39; =&gt; sub {<br>  if (request-&gt;path_info !~ m{^/app/log}) {<br>
    # match login and logout<br>    if (session(&#39;user&#39;) &amp;&amp; session(&#39;time&#39;)) {<br>      my $time_now = time;<br>      if ($time_now - session(&#39;time&#39;) &lt; config-&gt;{&#39;session_timeout&#39;}) {<br>
        session &#39;time&#39; =&gt; $time_now;<br>        #context-&gt;session &#39;time&#39; =&gt; $time_now;<br>      }<br>      else {<br>        return redirect &#39;/app/logout?msg=session_expired&amp;path=&#39; . request-&gt;path_info;<br>
      }<br>    }<br>    else {<br>      return redirect &#39;/app/login&#39;;<br>    }<br>  }<br>};<br><br>get &#39;/app/login&#39; =&gt; sub {<br><br>  my $hostname = request-&gt;{&#39;host&#39;};<br>  my $msg = &#39;please login&#39;;<br>
  if (exists params-&gt;{&#39;msg&#39;}) {<br>    $msg = params-&gt;{&#39;msg&#39;};<br>    $msg =~ s/_/ /g;<br>  }<br>  my $path = &#39;/app/dashboard&#39;;<br>  if (exists params-&gt;{&#39;path&#39;}) {<br>    $path = params-&gt;{&#39;path&#39;};<br>
  }<br>  template &#39;<a href="http://login.tt">login.tt</a>&#39;, { hostname =&gt; $hostname, title =&gt; &#39;login&#39;, path =&gt; $path, message =&gt; $msg };<br><br>post &#39;/app/login&#39; =&gt; sub {<br><br>  # Validate web&lt;nm&gt; username and password against /etc/passwd<br>
  # TODO: use RESTful API to query <a href="http://api.zootzone.com">api.zootzone.com</a><br>  if (params-&gt;{&#39;pass&#39;} ne &#39;&#39;) {<br>    my $passwd = Authen::Simple::Passwd-&gt;new( path =&gt; config-&gt;{&#39;passwords&#39;} );<br>
    if ($passwd-&gt;authenticate(params-&gt;{&#39;user&#39;}, params-&gt;{&#39;pass&#39;})) {<br>      session &#39;user&#39; =&gt; params-&gt;{&#39;user&#39;};<br>      session &#39;time&#39; =&gt; time;<br>      if (params-&gt;{&#39;path&#39;}) {<br>
        return redirect params-&gt;{&#39;path&#39;};<br>      }<br>      else {<br>        return redirect &#39;/app/dashboard&#39;;<br>      }<br>    }<br>    else {<br>      return redirect &#39;/app/login?msg=authentication_failed&#39;;<br>
    }<br>  } else {<br>    return redirect &#39;/app/login?msg=invalid_credentials&#39;;<br>  }<br>};<br><br></div><div>other routes ....<br></div></div></div></div>