Django,创build一个自定义的500/404错误页面

按照这里find的教程,我不能创build一个自定义的500或404错误页面。 如果我input了错误的url,页面会给我默认的错误页面。 有什么我应该检查,这将防止自定义页面显示?

文件目录:

mysite/ mysite/ __init__.py __init__.pyc settings.py settings.pyc urls.py urls.pyc wsgi.py wsgi.pyc polls/ templates/ admin/ base_site.html 404.html 500.html polls/ detail.html index.html __init__.py __init__.pyc admin.py admin.pyc models.py models.pyc tests.py urls.py urls.pyc view.py views.pyc templates/ manage.py 

内mysite / settings.py我有这些启用:

 DEBUG = False TEMPLATE_DEBUG = DEBUG #.... TEMPLATE_DIRS = ( 'C:/Users/Me/Django/mysite/templates', ) 

在mysite / polls / urls.py中:

 from django.conf.urls import patterns, url from polls import views urlpatterns = patterns('', url(r'^$', views.index, name='index'), url(r'^(?P<poll_id>\d+)/$', views.detail, name='detail'), url(r'^(?P<poll_id>\d+)/results/$', views.results, name='results'), url(r'^(?P<poll_id>\d+)/vote/$', views.vote, name='vote'), 

我可以发布任何其他必要的代码,但是如果我使用了一个错误的url,那么我应该改变什么来获得一个自定义的500错误页面?

编辑

解决scheme:我有一个额外的

 TEMPLATE_DIRS 

在我的settings.py,这是造成这个问题

在您的主views.py添加您自己的以下两个视图的自定义实现,并设置您想要显示的模板404.html500.html

有了这个解决scheme,不需要将自定义代码添加到urls.py

代码如下:

 from django.shortcuts import render_to_response from django.template import RequestContext def handler404(request): response = render_to_response('404.html', {}, context_instance=RequestContext(request)) response.status_code = 404 return response def handler500(request): response = render_to_response('500.html', {}, context_instance=RequestContext(request)) response.status_code = 500 return response 

官方回答:

以下是有关如何设置自定义错误视图的官方文档的链接:

https://docs.djangoproject.com/en/stable/topics/http/views/#customizing-error-views

它说在URLconf中添加这样的行(在其他地方设置它们将不起作用):

 handler404 = 'mysite.views.my_custom_page_not_found_view' handler500 = 'mysite.views.my_custom_error_view' handler403 = 'mysite.views.my_custom_permission_denied_view' handler400 = 'mysite.views.my_custom_bad_request_view' 

您还可以通过修改设置CSRF_FAILURE_VIEW来自定义CSRF错误视图。

默认error handling程序:

值得阅读缺省error handling程序page_not_foundserver_errorpermission_deniedbad_request 。 默认情况下,他们使用这些模板,如果他们能分别find它们: 404.html500.html403.html400.html

所以,如果你想要做的只是制作漂亮的错误页面,只需在TEMPLATE_DIRS目录下创build这些文件,那么根本就不需要编辑URLConf。 阅读文档以查看哪些上下文variables可用。

在Django 1.10及更高版本中,默认的CSRF错误视图使用模板403_csrf.html

疑难杂症:

不要忘记, DEBUG必须设置为False才能起作用,否则将使用正常的debugging处理程序。

在urls.py中添加这些行

urls.py

 from django.conf.urls import ( handler400, handler403, handler404, handler500 ) handler400 = 'my_app.views.bad_request' handler403 = 'my_app.views.permission_denied' handler404 = 'my_app.views.page_not_found' handler500 = 'my_app.views.server_error' # ... 

并在views.py中实现我们的自定义视图。

views.py

  from django.shortcuts import ( render_to_response ) from django.template import RequestContext # HTTP Error 400 def bad_request(request): response = render_to_response( '400.html', context_instance=RequestContext(request) ) response.status_code = 400 return response # ... 

从您引用的页面:

当你在视图中引发Http404时,Django将加载专门的视图来处理404错误。 它通过在您的根URLconf中查找variableshandler404(并且只在您的根URLconf中;在其他地方设置handler404将不起作用)来find它,这是Python虚线语法中的string – 正常的URLconfcallback使用的格式。 404视图本身没有什么特别之处:这只是一个普通的视图。

所以我相信你需要添加这样的东西到你的urls.py:

 handler404 = 'views.my_404_view' 

和handler500类似。

如果你所需要的只是在DEBUG = False时候显示自定义页面,那么你的网站会有一些奇特的错误信息,然后在模板目录中添加两个名为404.html和500.html的模板,当404或500被提出。

settings.py ::::

 DEBUG = False TEMPLATE_DEBUG = DEBUG ALLOWED_HOSTS = ['localhost'] #provide your host name 

并在模板文件夹中添加您的404.html和500.html页面。 从民意调查应用程序中的模板中删除404.html和500.html。

发生错误,在错误页面找出从哪里Django正在加载模板。我的意思是path堆栈。在基本template_dir添加这些HTML页面500.html404.html 。 发生这些错误时,相应的模板文件将自动加载。

您也可以为其他错误代码添加页面,如400403

希望这个帮助!

作为一个单行(对于404通用页面):

 from django.shortcuts import render_to_response from django.template import RequestContext return render_to_response('error/404.html', {'exception': ex}, context_instance=RequestContext(request), status=404) 

尝试移动你的错误模板.../Django/mysite/templates/

我注意到这一点,但我认为这些需要是“全球”的网站。