Opened 11 months ago

Last modified 3 months ago

#29008 new Bug

When DEBUG is True, raising Http404 in a path converter's to_python method does not result in a technical response

Reported by: Antoine Humeau Owned by: nobody
Component: Core (URLs) Version: 2.0
Severity: Normal Keywords:
Cc: Herbert Fortes Triage Stage: Accepted
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

This is the response I get (plain text):

A server error occurred.  Please contact the administrator.

I understand a ValueError should be raised which tells the URL resolver "this path does not match, try next one" but Http404 is what came to my mind intuitively and the error message was not very helpful.

One could also make a point that raising a Http404 should be valid way to tell the resolver "this is indeed the right path but the current parameter value does not match anything so stop what you are doing and let the handler return the 404 page (including a helpful error message when DEBUG is True instead of the default 'Django tried these URL patterns')".

This would prove useful for example to implement a path converter that uses get_object_or_404.

Change History (3)

comment:1 Changed 11 months ago by Tim Graham

Triage Stage: UnreviewedAccepted

It seems that other exceptions correctly result in a technical 500 response.

comment:2 Changed 11 months ago by Antoine Humeau

The technical_404_response view performs a new URL resolving (cf https://github.com/django/django/blob/a8e492bc81fca829f5d270e2d57703c02e58701e/django/views/debug.py#L482) which will obviously raise a new Http404 which won't be caught as only Resolver404 is checked. That means the WSGI handler fails and the WSGI server returns the previously described default error message (indeed the error message is the default one from wsgiref.handlers.BaseHandler https://docs.python.org/3.6/library/wsgiref.html#wsgiref.handlers.BaseHandler.error_body).

The solution seems to be to catch Http404 instead of Resolver404 in technical_404_response. This will result in a technical 404 page with the Http404's message displayed and will match the behaviour of when DEBUG is False.

Last edited 11 months ago by Antoine Humeau (previous) (diff)

comment:3 Changed 3 months ago by Herbert Fortes

Cc: Herbert Fortes added
Note: See TracTickets for help on using tickets.
Back to Top