Как проверить 500.html в (django) env разработки? - PullRequest
45 голосов
/ 29 апреля 2010

Я использую Django для проекта и уже в производстве.

В производственной среде 500.html отображается при возникновении ошибки сервера.

Как проверить рендеринг 500.html в среде разработчика? Или как мне отобразить 500.html в dev, если я отключаю отладку, я все равно получаю ошибки, а не 500.html

справочная информация: я включаю некоторые элементы страницы на основе страницы, а некоторые отсутствуют при вызове 500.html и хочу отладить его в среде разработчика.

Ответы [ 8 ]

47 голосов
/ 30 апреля 2010

Я предпочитаю не выключать DEBUG. Вместо этого я поместил следующий фрагмент в urls.py:

if settings.DEBUG:
    urlpatterns += patterns('',
        (r'^500/$', 'your_custom_view_if_you_wrote_one'),
        (r'^404/$', 'django.views.generic.simple.direct_to_template', {'template': '404.html'}),
    )

В приведенном выше фрагменте страницы ошибок используется пользовательское представление, однако вы можете легко заменить его на представление direct_to_template Джанго.

Теперь вы можете проверить 500 и 404 страницы, позвонив по их URL: http://example.com/500 и http://example.com/404

27 голосов
/ 22 марта 2014

В Django 1.6 django.views.generic.simple.direct_to_template больше не существует, это мои настройки для особых видов:

# urls.py

from django.views.generic import TemplateView
from django.views.defaults import page_not_found, server_error

urlpatterns += [
    url(r'^400/$', TemplateView.as_view(template_name='400.html')),
    url(r'^403/$', TemplateView.as_view(template_name='403.html')),
    url(r'^404/$', page_not_found),
    url(r'^500/$', server_error),
]
17 голосов
/ 13 августа 2010

И если вы хотите использовать представление Django 500 по умолчанию вместо своего пользовательского представления:

if settings.DEBUG:
    urlpatterns += patterns('',
        (r'^500/$', 'django.views.defaults.server_error'),
        (r'^404/$', 'django.views.generic.simple.direct_to_template', {'template': '404.html'}),
    )
7 голосов
/ 17 января 2014

Продолжение ответ Шанью , в Django 1.3+ используйте:

if settings.DEBUG:
    urlpatterns += patterns('',
        (r'^500/$', 'django.views.defaults.server_error'),
        (r'^404/$', 'django.views.defaults.page_not_found'),
    )
5 голосов
/ 29 апреля 2010

Оба параметра отладки неверны?

settings.DEBUG = False
settings.TEMPLATE_DEBUG = False
1 голос
/ 31 марта 2017

Как мне сделать и протестировать пользовательские обработчики ошибок

Определить пользовательский View на основе TemplateView

# views.py
from django.views.generic import TemplateView

class ErrorHandler(TemplateView):

    """ Render error template """

    error_code = 404
    template_name = 'index/error.html'

    def dispatch(self, request, *args, **kwargs):
        """ For error on any methods return just GET """
        return self.get(request, *args, **kwargs)

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['error_code'] = self.error_code
        return context

    def render_to_response(self, context, **response_kwargs):
        """ Return correct status code """
        response_kwargs = response_kwargs or {}
        response_kwargs.update(status=self.error_code)
        return super().render_to_response(context, **response_kwargs)

Скажите django использовать пользовательские обработчики ошибок

# urls.py

from index.views import ErrorHandler

# error handing handlers - fly binding
for code in (400, 403, 404, 500):
    vars()['handler{}'.format(code)] = ErrorHandler.as_view(error_code=code)

Тестовый пример для пользовательских обработчиков ошибок

# tests.py

from unittest import mock

from django.test import TestCase
from django.core.exceptions import SuspiciousOperation, PermissionDenied
from django.http import Http404
from index import views

class ErrorHandlersTestCase(TestCase):

    """ Check is correct error handlers work """

    def raise_(exception):
        def wrapped(*args, **kwargs):
            raise exception('Test exception')
        return wrapped

    def test_index_page(self):
        """ Should check is 200 on index page """
        response = self.client.get('/')
        self.assertEqual(response.status_code, 200)
        self.assertTemplateUsed(response, 'index/index.html')

    @mock.patch('index.views.IndexView.get', raise_(Http404))
    def test_404_page(self):
        """ Should check is 404 page correct """
        response = self.client.get('/')
        self.assertEqual(response.status_code, 404)
        self.assertTemplateUsed(response, 'index/error.html')
        self.assertIn('404 Page not found', response.content.decode('utf-8'))

    @mock.patch('index.views.IndexView.get', views.ErrorHandler.as_view(error_code=500))
    def test_500_page(self):
        """ Should check is 500 page correct """
        response = self.client.get('/')
        self.assertEqual(response.status_code, 500)
        self.assertTemplateUsed(response, 'index/error.html')
        self.assertIn('500 Server Error', response.content.decode('utf-8'))

    @mock.patch('index.views.IndexView.get', raise_(SuspiciousOperation))
    def test_400_page(self):
        """ Should check is 400 page correct """
        response = self.client.get('/')
        self.assertEqual(response.status_code, 400)
        self.assertTemplateUsed(response, 'index/error.html')
        self.assertIn('400 Bad request', response.content.decode('utf-8'))

    @mock.patch('index.views.IndexView.get', raise_(PermissionDenied))
    def test_403_page(self):
        """ Should check is 403 page correct """
        response = self.client.get('/')
        self.assertEqual(response.status_code, 403)
        self.assertTemplateUsed(response, 'index/error.html')
        self.assertIn('403 Permission Denied', response.content.decode('utf-8'))
1 голос
/ 22 июня 2015

urls.py

handler500 = 'project.apps.core.views.handler500'
handler404 = 'project.apps.core.views.handler404'

views.py

from django.template.loader import get_template
from django.template import Context
from django.http import HttpResponseServerError, HttpResponseNotFound


def handler500(request, template_name='500.html'):
    t = get_template(template_name)
    ctx = Context({})
    return HttpResponseServerError(t.render(ctx))


def handler404(request, template_name='404.html'):
    t = get_template(template_name)
    ctx = Context({})
    return HttpResponseNotFound(t.render(ctx))

tests.py

from django.test import TestCase
from django.test.client import RequestFactory

from project import urls

from ..views import handler404, handler500


class TestErrorPages(TestCase):

    def test_error_handlers(self):
        self.assertTrue(urls.handler404.endswith('.handler404'))
        self.assertTrue(urls.handler500.endswith('.handler500'))
        factory = RequestFactory()
        request = factory.get('/')
        response = handler404(request)
        self.assertEqual(response.status_code, 404)
        self.assertIn('404 Not Found!!', unicode(response))
        response = handler500(request)
        self.assertEqual(response.status_code, 500)
        self.assertIn('500 Internal Server Error', unicode(response))
0 голосов
/ 13 июля 2014

Вы можете просто определить handler404 и handler500 для ошибок в вашем основном views.py файле, как подробно описано в этом ответе:

https://stackoverflow.com/a/18009660/1913888

Это вернет ошибку, которую вы хотите, когда Django направляет к этому обработчику. Для перенаправления на другое имя URL не требуется настраиваемая конфигурация URL.

...