#27508 closed Cleanup/optimization (worksforme)
Debug 404 page shouldn't include the request path prefix in the description of URLconf matching
| Reported by: | Tzu-ping Chung | Owned by: | nobody |
|---|---|---|---|
| Component: | Error reporting | Version: | dev |
| Severity: | Normal | Keywords: | |
| Cc: | Triage Stage: | Accepted | |
| Has patch: | no | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
When I served a site under a prefix, and the site gets a 404, the default (debug) page shows something like
Using the URLconf defined in ..., Django tried these URL patterns, in this order: 1. ^foo/$ 2. ^bar/whatever$ The current URL, prefix/foo/bar/, didn't match any of these.
The “The current URL” part shows the complete path, i.e. with the prefix I served Django under. This is very confusing because Django does not actually match it with the patterns. Looking into the code it seems the 404 handler (django.views.defaults.page_not_found) should use request.path_info instead of request.path in its context.
Change History (3)
comment:1 by , 9 years ago
comment:2 by , 9 years ago
| Component: | Core (Other) → Error reporting |
|---|---|
| Summary: | Default 404 page should show request.path_info instead of request.path → Debug 404 page shouldn't include the request path prefix in the description of URLconf matching |
| Triage Stage: | Unreviewed → Accepted |
The "Using the URLconf..." text is from the TECHNICAL_404_TEMPLATE -- this goes through the technical_404_response() view rather than page_not_found(). Modifying page_not_found() seems incorrect since in a production setting, the full path is likely desired. I'm not certain if the request_path in the technical_404_reponse() can be modified to fix the issue you described. Do you want to investigate further?
comment:3 by , 9 years ago
| Resolution: | → worksforme |
|---|---|
| Status: | new → closed |
I only see the path_info in the debug view technical_404_response(), not the full path. Looking through the actual debug view confirms this behaviour as well -- the URL resolver is only passed the path_info, so if a Resolver404 exception occurs, exception.args[0]['path'] can only contain the path_info, not the path. The except clause uses request.path_info.
A little more info:
This is where Django finds a match for this URL.
https://github.com/django/django/blob/44a6b40/django/core/handlers/base.py#L172
And this is where it shows the URL on the 404 page.
https://github.com/django/django/blob/44a6b40/django/views/defaults.py#L40