Fixed #20822 -- Set content type of default error pages to 'text/html'.

Thanks Jimmy Song for the patch.
This commit is contained in:
Aymeric Augustin 2013-08-04 11:01:01 +02:00
parent 0bcdcc7eb9
commit 784377544e
4 changed files with 36 additions and 10 deletions

View File

@ -21,11 +21,14 @@ def page_not_found(request, template_name='404.html'):
""" """
try: try:
template = loader.get_template(template_name) template = loader.get_template(template_name)
content_type = None # Django will use DEFAULT_CONTENT_TYPE
except TemplateDoesNotExist: except TemplateDoesNotExist:
template = Template( template = Template(
'<h1>Not Found</h1>' '<h1>Not Found</h1>'
'<p>The requested URL {{ request_path }} was not found on this server.</p>') '<p>The requested URL {{ request_path }} was not found on this server.</p>')
return http.HttpResponseNotFound(template.render(RequestContext(request, {'request_path': request.path}))) content_type = 'text/html'
body = template.render(RequestContext(request, {'request_path': request.path}))
return http.HttpResponseNotFound(body, content_type=content_type)
@requires_csrf_token @requires_csrf_token
@ -39,7 +42,7 @@ def server_error(request, template_name='500.html'):
try: try:
template = loader.get_template(template_name) template = loader.get_template(template_name)
except TemplateDoesNotExist: except TemplateDoesNotExist:
return http.HttpResponseServerError('<h1>Server Error (500)</h1>') return http.HttpResponseServerError('<h1>Server Error (500)</h1>', content_type='text/html')
return http.HttpResponseServerError(template.render(Context({}))) return http.HttpResponseServerError(template.render(Context({})))
@ -54,7 +57,7 @@ def bad_request(request, template_name='400.html'):
try: try:
template = loader.get_template(template_name) template = loader.get_template(template_name)
except TemplateDoesNotExist: except TemplateDoesNotExist:
return http.HttpResponseBadRequest('<h1>Bad Request (400)</h1>') return http.HttpResponseBadRequest('<h1>Bad Request (400)</h1>', content_type='text/html')
return http.HttpResponseBadRequest(template.render(Context({}))) return http.HttpResponseBadRequest(template.render(Context({})))
@ -75,7 +78,7 @@ def permission_denied(request, template_name='403.html'):
try: try:
template = loader.get_template(template_name) template = loader.get_template(template_name)
except TemplateDoesNotExist: except TemplateDoesNotExist:
return http.HttpResponseForbidden('<h1>403 Forbidden</h1>') return http.HttpResponseForbidden('<h1>403 Forbidden</h1>', content_type='text/html')
return http.HttpResponseForbidden(template.render(RequestContext(request))) return http.HttpResponseForbidden(template.render(RequestContext(request)))

View File

@ -2,7 +2,8 @@ from __future__ import unicode_literals
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.test import TestCase from django.test import TestCase
from django.test.utils import setup_test_template_loader, restore_template_loaders from django.test.utils import (setup_test_template_loader,
restore_template_loaders, override_settings)
from ..models import Author, Article, UrlArticle from ..models import Author, Article, UrlArticle
@ -59,3 +60,20 @@ class DefaultsTests(TestCase):
article = UrlArticle.objects.get(pk=1) article = UrlArticle.objects.get(pk=1)
self.assertTrue(getattr(article.get_absolute_url, 'purge', False), self.assertTrue(getattr(article.get_absolute_url, 'purge', False),
'The attributes of the original get_absolute_url must be added.') 'The attributes of the original get_absolute_url must be added.')
@override_settings(DEFAULT_CONTENT_TYPE="text/xml")
def test_default_content_type_is_text_html(self):
"""
Content-Type of the default error responses is text/html. Refs #20822.
"""
response = self.client.get('/views/raises400/')
self.assertEqual(response['Content-Type'], 'text/html')
response = self.client.get('/views/raises403/')
self.assertEqual(response['Content-Type'], 'text/html')
response = self.client.get('/views/non_existing_url/')
self.assertEqual(response['Content-Type'], 'text/html')
response = self.client.get('/views/server_error/')
self.assertEqual(response['Content-Type'], 'text/html')

View File

@ -45,8 +45,10 @@ urlpatterns = patterns('',
# a view that raises an exception for the debug view # a view that raises an exception for the debug view
(r'raises/$', views.raises), (r'raises/$', views.raises),
(r'raises404/$', views.raises404),
(r'raises400/$', views.raises400),
(r'raises403/$', views.raises403), (r'raises403/$', views.raises403),
(r'raises404/$', views.raises404),
# i18n views # i18n views
(r'^i18n/', include('django.conf.urls.i18n')), (r'^i18n/', include('django.conf.urls.i18n')),

View File

@ -2,7 +2,7 @@ from __future__ import unicode_literals
import sys import sys
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied, SuspiciousOperation
from django.core.urlresolvers import get_resolver from django.core.urlresolvers import get_resolver
from django.http import HttpResponse, HttpResponseRedirect from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render_to_response, render from django.shortcuts import render_to_response, render
@ -31,13 +31,16 @@ def raises(request):
except Exception: except Exception:
return technical_500_response(request, *sys.exc_info()) return technical_500_response(request, *sys.exc_info())
def raises404(request): def raises400(request):
resolver = get_resolver(None) raise SuspiciousOperation
resolver.resolve('')
def raises403(request): def raises403(request):
raise PermissionDenied raise PermissionDenied
def raises404(request):
resolver = get_resolver(None)
resolver.resolve('')
def redirect(request): def redirect(request):
""" """
Forces an HTTP redirect. Forces an HTTP redirect.