Opened 9 years ago
Last modified 9 years ago
#25878 closed Bug
APPEND_SLASH doesn't work with DEBUG=False — at Version 5
Reported by: | dong-won kang | Owned by: | nobody |
---|---|---|---|
Component: | HTTP handling | Version: | 1.9 |
Severity: | Release blocker | Keywords: | slash, debug |
Cc: | Jay Cox | Triage Stage: | Accepted |
Has patch: | yes | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description (last modified by )
I first uploaded it to google groups but I don't find where's my article is (I'm not get used to it) so I decided to make a ticket here.
as I mentioned in title, django 1.9's url slash redirection doesn't working well in debug=False. APPEND_SLASH was no effect. but in debug=True, it does well, and only these 'cached(loaded in debug mode)' url redirects well even in debug=False. (I don't know it's browser redirection or django's work ...)
anyway, I fixed django/middleware/common.py like this and works well. original code was rather a little strange, as I thought.
def process_request(self, request): """ Check for denied User-Agents and rewrite the URL based on settings.APPEND_SLASH and settings.PREPEND_WWW """ # Check for denied User-Agents if 'HTTP_USER_AGENT' in request.META: for user_agent_regex in settings.DISALLOWED_USER_AGENTS: if user_agent_regex.search(request.META['HTTP_USER_AGENT']): raise PermissionDenied('Forbidden user agent') # Check for a redirect based on settings.PREPEND_WWW redirect = False host = request.get_host() if settings.PREPEND_WWW and host and not host.startswith('www.'): redirect = True host = 'www.' + host # Check if we also need to append a slash so we can do it all # with a single redirect. if self.should_redirect_with_slash(request): redirect = True path = self.get_full_path_with_slash(request) else: path = request.get_full_path() if (redirect): return self.response_redirect_class('%s://%s%s' % (request.scheme, host, path))
Hope this issue can be meaningful.
thanks for reading
PS changed a little - previous code won't work with prepending WWW
Change History (5)
comment:1 by , 9 years ago
Type: | Uncategorized → Bug |
---|
comment:2 by , 9 years ago
Description: | modified (diff) |
---|
follow-up: 4 comment:3 by , 9 years ago
Summary: | Django 1.9 works well in Debug=True, but doesn't redirect unslash urls into slashed one in Debug=False → APPEND_SLASH doesn't work with DEBUG=False |
---|
comment:4 by , 9 years ago
Replying to timgraham:
Could you be a little more specific with the steps to reproduce the error, perhaps providing a sample project or a regression test for Django? Your suggested changes don't pass the current tests (failures in
middleware
).
My project is here and currently running. Changed code is applied to my project currently and running well. I don't know well about django's module test or deep hierarchy of django module, so I need to find more about them if I have to fix this problem fully correctly. I'll comment more when I find something new about it.
comment:5 by , 9 years ago
Description: | modified (diff) |
---|
I did test and look at the code, and I have question to the behavior.
I found failed test test_non_ascii_query_string_does_not_crash
, and It requires http://testserver/slash/?drink=caf%C3%A9
to be redirected(301). I think It doesn't need to be, as there's no need to prepend WWW(False default) and redirect with slash.
I think the test should changed to self.assertEqual(r.status_code, None)
, not 301.
and one more thing - this bug has occurred since I upgraded django from 1.8.7 to 1.9. In that case, URL without slash returns 500, not 404, and that makes process_response
not working I think. I'm inspecting more about this.
thanks for your sincere.
PS. when debug=False, after Not Found URL occured, this exception occurs: TemplateSyntaxError: Could not parse the remainder: '('static', filename='img/404.jpg')' from 'url_for('static', filename='img/404.jpg')'
, and that makes response code to 500, not 404.
Could you be a little more specific with the steps to reproduce the error, perhaps providing a sample project or a regression test for Django? Your suggested changes don't pass the current tests (failures in
middleware
).