I am also experiencing this "issue". I see this in routes.example.py:

--snip--
# In the event that the error-handling page itself returns an error, web2py will
# fall back to its old static responses.  You can customize them here.
# ErrorMessageTicket takes a string format dictionary containing (only) the
# "ticket" key.
--snip--

Is that referring to an error with the "error_handler" action, or the
"routes_onerror" tuple?

I guess what I'm asking is the redirect loop expected, or should
web2py be catching the error and failing back to the default error
message/page?


--Marc

On Thu, Feb 17, 2011 at 11:20 AM, Jonathan Lundell <jlund...@pobox.com> wrote:
> On Feb 17, 2011, at 7:53 AM, David J. wrote:
>>
>> I did notice one 'race' condition;
>>
>> If you have an app that has an error in models/db.py
>>
>> and you have */400 in routes.py your going to continuously be redirecting 
>> your self to the same page until the browsers own error handling kicks in 
>> and notifies of the problem;
>>
>> Because in any page load your going to be throwing a 400 including the page 
>> you want to be redirect to; Unless of course your redirecting to a static 
>> page;
>
> Good point.
>
> One consequence of that is that it's probably a good idea not to use error 
> redirection during development (except of course when you're testing error 
> redirection); even if it doesn't loop, it's likely to confuse the error more 
> than clarify it.
>
>
> I'm not sure how one would break the error loop. I was thinking maybe adding 
> an http header line, but the request for the error page is ultimately the 
> result of a redirection, so there's no http request for us to get our hands 
> on.
>
>>
>>
>>
>>
>>
>> On 2/17/11 10:45 AM, Jonathan Lundell wrote:
>>> A couple of questions have come up about routes_onerror in routes.py. 
>>> Refreshing our memory, here's a fragment of routes.example.py:
>>>
>>> # Error-handling redirects all HTTP errors (status codes>= 400) to a 
>>> specified
>>> # path.  If you wish to use error-handling redirects, uncomment the tuple
>>> # below.  You can customize responses by adding a tuple entry with the first
>>> # value in 'appName/HTTPstatusCode' format. ( Only HTTP codes>= 400 are
>>> # routed. ) and the value as a path to redirect the user to.  You may also 
>>> use
>>> # '*' as a wildcard.
>>> #
>>> # The error handling page is also passed the error code and ticket as
>>> # variables.  Traceback information will be stored in the ticket.
>>> #
>>> # routes_onerror = [
>>> #     (r'init/400', r'/init/default/login')
>>> #    ,(r'init/*', r'/init/static/fail.html')
>>> #    ,(r'*/404', r'/init/static/cantfind.html')
>>> #    ,(r'*/*', r'/init/error/index')
>>> # ]
>>>
>>> If you want to follow along in the source, this is used by 
>>> rewrite.try_redirect_on_error, which is called at the end of a request by 
>>> main.wsgibase.
>>>
>>> One thing I just noticed from looking at the path through the source is 
>>> that, if the incoming URL doesn't conform to the main URL regex (and I'm 
>>> talking about "normal" URL handling here, not the new URL router), 
>>> routes_onerror is used when request.application is still set to None, which 
>>> is now it's initialized. The status code will be 400.
>>>
>>> So if you want routes_onerror to be effective in this case, you'll need to 
>>> have at least one entry with the application field set to '*' or to 'None' 
>>> (the string representation of the None object).
>>>
>>>   'init/400', ...
>>>   'init/404', ...
>>>   'None'/400' ...
>>>
>>> Unless you have a specific reason not to, it's probably best to have a 
>>> '*/*' catch-all case at the end as well. You never know...
>>>
>>> I'll be looking over the new router code with this in mind, but it's likely 
>>> similar in operation.
>>
>
>
>

Reply via email to