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?? Thanks for you time and help. -AK
+-------[ 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@theinternet.com.au
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@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@theinternet.com.au
+-------[ Analog Kid ]---------------------- | 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?? I'm not sure how to detect if a redirect is necessary, I haven't trundled through the RESPONSE object enough, but, if you can work it out, you can probably grab the _exec method from PageTemplate, check and return empty there, or let it continue through to rendering. -- Andrew Milton akm@theinternet.com.au
ah great ... thanks very much ... ill give this a shot. many thanks, AK On Tue, Mar 10, 2009 at 4:31 PM, Andrew Milton <akm@theinternet.com.au>wrote:
+-------[ Analog Kid ]---------------------- | 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??
I'm not sure how to detect if a redirect is necessary, I haven't trundled through the RESPONSE object enough, but, if you can work it out, you can probably grab the _exec method from PageTemplate, check and return empty there, or let it continue through to rendering.
-- Andrew Milton akm@theinternet.com.au
participants (2)
-
Analog Kid -
Andrew Milton