[Zope] Avoiding page redirects from TAL

Analog Kid garlictrompet at gmail.com
Tue Mar 10 06:58:07 EDT 2009


hi andrew:

thx for your help. i dont want to call the method from the PT ... infact I
dont want to modify the PT at all ... i just need to figure out a
ZopePageTemplate.py method which I can patch so I can do the redirect even
before the PT is rendered.

any ideas??

regards,
A

On Tue, Mar 10, 2009 at 11:59 AM, Andrew Milton <akm at theinternet.com.au>wrote:

> +-------[ Analog Kid ]----------------------
> | Hi All:
> |
> | I have a customized page template product which subclasses from
> | ZopePageTemplate. In this product class, I have a method that redirects
> to a
> | certain fixed page that I have created in the ZMI. One of the objects of
> this
> | type makes calls to this method and also has some conditional redirects
> (based
> | on certain request variables). Here is a representation
> |
> | In my Product class, I have a method which conditionally redirects ...
> |
> | def check_and_redirect(self):
> |     request = self.REQUEST
> |     if request.get('redirect_to_fixed_page', False):
> |         request.RESPONSE.redirect('http://somefixedurl_in_my_domain')
> |
> | def getValue(self):
> |     self.check_and_redirect()
> |     # do some more stuff
> |     ....
> |     ....
> |     return 'some value'
> |
> | My ZPT looks like this ...
> | ...
> | <tal:call tal:define="data python:mytemplate.getValue()"/>
> | ...
> | ...
> | ...
> | ...
> | <tal:redir tal:condition="python:here.REQUEST.has_key('var')">
> | <tal:dummy tal:define="test
> python:here.REQUEST.RESPONSE.redirect('http://
> | someotherurl")"/>
> | </tal:redir>
> | ...
> | ...
> | ...
> |
> |
> | What is happeninig is that the redirect in the PT is taking precedence
> over my
> | redirect (which Im doing in the method). My question is: Can I make sure
> that
> | my redirect takes precedence without modifying the PT itself. Is there
> any
> | other ZopePageTemplate method which I can patch so that my own redirect
> kicks
> | in first??
>
> add a flag to getValue that says don't redirect
>
> def getValue(self, redirect = False):
>   if(redirect):
>       self.check_and_redirect()
>
> or pass it up to check_and_redirect
>
> Which means you have to change other calls that aren't in the ZPT
> If you're happy to change the one ZPT, you can reverse the flag to be
> True and pass False in from the ZPT.
>
> It depends which way is more work.
>
> You'll also find that doing a redirect and then adding more stuff to the
> response will cause the redirect to "not work" under certain browsers
> under certain conditions. It's best to terminate processing as soon as
> possible when you decide to redirect, so it's probably unwise to
> redirect without returning some status to the caller than indicates the
> rest of the processing is redundant.
>
> --
> Andrew Milton
> akm at theinternet.com.au
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.zope.org/pipermail/zope/attachments/20090310/c2d12904/attachment.html 


More information about the Zope mailing list