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