首页 > temp > python入门教程 >
-
Django中创建自定义错误页面(400,403,404,500)
在浏览网页的时候,浏览者可能会输入错误的URL,或者访问的网页不再存在是很常见的。这种情况下,你一般都会怎么处理呢?
有三种选择:
重定向到网站的首页;
显示无聊的400/403/404/500页面,并提供一链接可链接至首页;
创建一有趣的自定义400/403/404/500错误页面。
这篇文章主要介绍在Django中如何自定义错误页面,分为下面四个步骤:
创建自定义错误页面
在项目的templates目录下,创建errors目录,然后在此目录下分别创建好page_400.html,page_403.html,page_404.html,page_500.html。
修改settings.py设置
修改项目目录下的settings.py,设置 DEBUG=False 以及 ALLOWED_HOST=["*"] 。这是因为自定义的错误页面只会在非调试模式下生效。
修改视图
在项目的views.py中,创建如下的错误页面处理方法:
from django.shortcuts import render
def bad_request(request):
return render(request,'errors/page_400.html')
def permission_denied(request):
return render(request,'errors/page_403.html')
def page_not_found(request):
return render(request,'errors/page_404.html')
def server_error(request):
return render(request,'errors/page_500.html')
1
2
3
4
5
6
7
8
9
10
11
12
13
配置urls
在项目的urls.py文件中,导入handler400,handler403,handler404,handler500,重新设置错误页面的处理为我们上面views.py里创建的方法:
from . import views
from django.conf.urls import handler400, handler403, handler404, handler500
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^myapp/', include('myapp.urls', namespace='myapp')),
]
handler400 = views.bad_request
handler403 = views.permission_denied
handler404 = views.page_not_found
handler500 = views.server_error
1
2
3
4
5
6
7
8
9
10
11
12
13
至此,重新运行,输入错误的网址可以看到显示的是我们创建的自定义404页面。
TIPS
若你使用的是Django 2.0版本,则上述会报如下的错误:
“handler404() got an unexpected keyword argument ‘exception’”
这是因为在新版本中内置的错误处理方法签名有更改导致的,具体可以看:https://docs.djangoproject.com/en/2.0/ref/views/#error-views
只需要在修改views.py中代码为:
from django.shortcuts import render
def bad_request(request, exception, template_name='errors/page_400.html'):
return render(request, template_name)
def permission_denied(request, exception, template_name='errors/page_403.html'):
return render(request, template_name)
def page_not_found(request, exception, template_name='errors/page_404.html'):
return render(request, template_name)
def server_error(request, exception, template_name='errors/page_500.html'):
return render(request, template_name)