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.html和500.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_found
, server_error
, permission_denied
和bad_request
。 默认情况下,他们使用这些模板,如果他们能分别find它们: 404.html
, 500.html
, 403.html
和400.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.html , 404.html 。 发生这些错误时,相应的模板文件将自动加载。
您也可以为其他错误代码添加页面,如400和403 。
希望这个帮助!
作为一个单行(对于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/
?
我注意到这一点,但我认为这些需要是“全球”的网站。