0%

Django中创建自定义错误页面(400,403,404,500)

在浏览网页的时候,浏览者可能会输入错误的URL,或者访问的网页不再存在是很常见的。这种情况下,你一般都会怎么处理呢?

有三种选择

  1. 重定向到网站的首页;
  2. 显示无聊的400/403/404/500页面,并提供一链接可链接至首页;
  3. 创建一有趣的自定义400/403/404/500错误页面。

这篇文章主要介绍在Django中如何自定义错误页面,分为下面四个步骤

  1. 创建自定义错误页面
    在项目的templates目录下,创建errors目录,然后在此目录下分别创建好page_400.html,page_403.html,page_404.html,page_500.html。

  2. 修改settings.py设置
    修改项目目录下的settings.py,设置 DEBUG=False 以及 ALLOWED_HOST=[“*”] 。这是因为自定义的错误页面只会在非调试模式下生效。

  3. 修改视图
    在项目的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’)

  4. 配置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

至此,重新运行,输入错误的网址可以看到显示的是我们创建的自定义404页面。
注意
若你使用的是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)
```bash

-------------本文结束感谢您的阅读-------------