[Zope-Perl] REQUEST object

Monty Taylor mtaylor@goldridge.net
Wed, 02 Aug 2000 16:08:51 +0200


Thank you! That makes perfect sense now. And it all works now like I'm
expecting. (Now
that I know what I should be expecting. :) )

Thanks again,
Monty

Gisle Aas wrote:
> 
> Monty Taylor <mtaylor@goldridge.net> writes:
> 
> > Gisle Aas wrote:
> > > The REQUEST object will just be Python::Object reference when passed
> > > to perl.  The reason you see the contents as html is probably that the
> > > python object underneath provide a __str__ method returning that stuff
> > > and if you simply use a Python::Object in string context perl will
> > > invoke the equivalent of str(o) and use that.  If you just call
> > > methods on the object it should work.
> >
> > That makes sense. I was calling it in string context.
> >
> > Here's what I finally did that worked:
> > dtml-method:
> > <dtml-call "test_perl(REQUEST)">
> >
> > PerlMethod:
> >   Arguments: REQUEST
> >   Code:      my $foo=shift;
> >              foreach ( $foo->keys ){
> >                print;  #Goes to stderr in Debug mode
> >                print "\n";
> >              }
> >
> 
> > As a note, test_perl(REQUEST=REQUEST) does not work, and neither
> > does just plain test_perl().
> 
> I am not totally sure what test_perl(REQUEST=REQUEST) does in DTML,
> but if it was python and test_perl was a perl function then it would
> invoke the function as:
> 
>    test_perl("REQUEST", REQUEST);
> 
> i.e. you get two arguments where the second is the object you want.
> Python keyword arguments are passed as key/value pairs to a perl
> function after any position arguments.  I could not figure out a
> better way to handle them.
> 
> And test_perl() probably calls it directly without any arguments at
> all so $foo would be 'undef' in this case.
> 
> > What does the REQUEST in the arguments get us?
> 
> It is for ZPublisher's mashalling of various HTTP variables into a
> function argument list.  If you access your perl method directly as:
> 
>    http://yourzope:8080/test_perl
> 
> then ZPublisher will call the function with the arguments you
> specified in the "Arguments" field.
> 
> > Since we're using Perl shift to grab arguments from @_,
> > we're not really providing named parameters.
> 
> Correct.  Perl does not have named routine parameters yet.
> 
> > Yet without REQUEST in the arguments, it doesn't work.
> 
> Again, the arguments only apply if you publish the method directly.
> If you embed a direct call from DTML then you need to provide whatever
> methods are needed, but the perl runtime does not check the argument
> list for you as python would have done.  You don't get an exception
> unless the perl code explicitly checks it's arguments and die on
> trouble.
> 
> > This method of doing things seems to work fine, but I'd love to
> > understand what's actually happening here. Any thoughts?
> 
> I hope things are clearer now.  Please continue to ask if things are
> still unclear.
> 
> Regards,
> Gisle