如何在(django)开发环境中测试500.html?

lud*_*d0h 46 django development-environment

我正在使用Django进行项目,并且已经投入生产.

在生产环境中,每当发生服务器错误时都会呈现500.html.

如何在开发环境中测试500.html的渲染?或者我如何在开发中渲染500.html,如果我关闭调试我仍然得到错误而不是500.html

背景:我包含一些基于页面的页面元素,有些在调用500.html时丢失,并且想要在开发环境中调试它.

sha*_*nyu 46

我不想关掉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'}),
    )
Run Code Online (Sandbox Code Playgroud)

在上面的代码片段中,错误页面使用自定义视图,您可以轻松地将其替换为Django的direct_to_template视图.

现在,您可以通过调用其网址来测试500和404页:http://example.com/500http://example.com/404

  • 如果您只是想看看它们的外观,这很有用,但不要误以为这不会"测试"您应用中的http错误代码. (11认同)
  • 从v1.5开始,`direct_to_template`消失了.使用例如`来自django.views.generic.base导入TemplateView`然后`url(r'^ tests/404/$',TemplateView.as_view(template_name ='404.html'),name ='test404'),` (7认同)
  • 从 Django v3.0 开始,使用类似这样的内容:`path("404.html", TemplateView.as_view(template_name="404.html"), name="404-test")` (2认同)

dav*_*ode 28

在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),
]
Run Code Online (Sandbox Code Playgroud)

  • 在 Django 的更高版本中(不确定何时更改),使用 ```url(r"^404/$", page_not_found, {'exception': Http404()})```。 (3认同)
  • 嗯,我得到page_not_found()需要至少2个参数(给定1) (2认同)

小智 17

如果您想使用默认的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'}),
    )
Run Code Online (Sandbox Code Playgroud)


Udi*_*Udi 7

继续shanyu的回答,在Django 1.3+中使用:

if settings.DEBUG:
    urlpatterns += patterns('',
        (r'^500/$', 'django.views.defaults.server_error'),
        (r'^404/$', 'django.views.defaults.page_not_found'),
    )
Run Code Online (Sandbox Code Playgroud)


tak*_*kje 7

对于 Django > 3.0,只需将raise_request_exception值设置为False.

from django.test import TestCase


class ViewTestClass(TestCase):
    def test_error_page(self):
        self.client.raise_request_exception = False
        response = self.client.get(reverse('error-page'))
        self.assertEqual(response.status_code, 500)
        self.assertTrue(
            'some text from the custom 500 page'
            in response.content.decode('utf8'))

Run Code Online (Sandbox Code Playgroud)

文档:https ://docs.djangoproject.com/en/3.2/topics/testing/tools/

注意:如果错误页面引发异常,则会在测试日志中显示为错误。默认情况下,您可以将测试日志记录设置为“严重”以抑制该错误。


mae*_*rsu 5

两个调试设置都是假的吗?

settings.DEBUG = False
settings.TEMPLATE_DEBUG = False
Run Code Online (Sandbox Code Playgroud)