Nick wrote ..
> Graham Dumpleton wrote:
> >>Graham Dumpleton wrote:
> > Unfortunately you can't do that as all Python request objects in that
> > chain are created fresh for the handler which is the target of the
> > internal redirect. When the internal redirect returned, the cached
> > would then be actually different to the original. It would still return
> > the same underlying Apache data, but any extra stuff added to the
> > request object from Python code wouldn't be accessible.
> 
> The cleanup routine gets called at the end of each request, so I don't
> think that's an issue that couldn't be resolved with the method I was 
> describing.  Perhaps I was being too simplistic in my example to fully
> explain what I was thinking, though.
> 
> But in any case, I think the problem could be solved much more simply by
> changing the following code:
> 
>      def set_req(self, req):
>          prev_req = self.local.req
>          self.local.req = req
> 
>          def free_req():
>              self.local.req = prev_req
>          req.register_cleanup(free_req)
> 
> That should take care of restoring the previous "cached" request object
> without explicitly creating a stack (i.e. relying on the Python call 
> stack to bind local variables in the closure).

Yeah, that would work. Quite cute actually.

It is only recently that I realised that a nested function like that
could access stack variables of the enclosing function. Might look
at changing how I do things to use this method and eliminate
my use of the list as a stack.

Thanks.

Graham

Reply via email to