[Zope] Avoiding page redirects from TAL

Andrew Milton akm at theinternet.com.au
Tue Mar 10 02:29:37 EDT 2009


+-------[ 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


More information about the Zope mailing list