Loading

Django - 自定义错误页面

before

Django2.2 + Python3.6.8

在Django的调试环境,遇到404、403、500等等,这些错误的页面都是使用Django内置的错误页面。但在上线环境中,却需要我们配置自定义的美观、简洁的错误页面,那怎么玩呢?
这里提供两种方式,

  • 第一种是创建特殊名称的模板文件,这种方式写法固定,但很简单。
  • 第二种是使用句柄的方式,也是我推荐的方式,这种方式不拘泥于模板文件名和位置,相对灵活。

声明:示例以Django2.2版本为准,其他版本套路也类似。

Django都支持自定义哪些错误页面

在研究具体配置之前,要知道我们都可以自定义哪些错误页面,通过Django的源码,源码在你Python解释器安装目录下的\Lib\site-packages\django\conf\urls\__init__.py中:

from django.urls import include, re_path
from django.views import defaults

__all__ = ['handler400', 'handler403', 'handler404', 'handler500', 'include', 'url']

handler400 = defaults.bad_request
handler403 = defaults.permission_denied
handler404 = defaults.page_not_found
handler500 = defaults.server_error


def url(regex, view, kwargs=None, name=None):
    return re_path(regex, view, kwargs, name)

可以看到,支持400、403、404、500这几个错误页面的自定制。
接下来,来看具体怎么配置吧!

settings配置

无论是哪一种配置,都需要先配置settings,在settings.py中:

# 将DEBUG模式设置为False
# DEBUG = True
DEBUG = False

# 指定 ALLOWED_HOSTS 地址
# ALLOWED_HOSTS = []   # 这是搭配DEBUG = True模式用的

# 线上环境使用
ALLOWED_HOSTS = ['具体的IP/域名']  # 供客户端访问

# 我为了演示,使用
ALLOWED_HOSTS = ['127.0.0.1']

# 然后保证模板文件路径配置好了
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')]   # 保证路径配置正确
        ,
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

接下来,就看两种自定义错误页面怎么配置的吧。

方法1:创建特殊命名的文件

这种方式说白了,这种方式是借助了 Django 的模板查找规则进行的。
具体配置
除了上面的settings配置之外,什么路由、视图统统不用管,直接在你项目下的templates目录中新建:

400.html
403.html
404.html
500.html

注意,文件名必须是这几个指定的,别的不识别.....然后你在各自的文件中写你的自定义内容即可。

方法2:使用句柄

在你的项目总路由文件urls.py中:

from django.contrib import admin
from django.urls import path, re_path, include
from app01 import views


# 路由这里不变,该怎么写怎么写
urlpatterns = [
    path('admin/', admin.site.urls),
    path('app01/', include('app01.urls', namespace='app01')),
    path('app02/', include('app02.urls', namespace='app02')),

    path('books/', views.books, name='book'),
    # 无名分组
    re_path('add_book/(\d+)/', views.add_book, name='add_book'),
    re_path('t1/(\d+)/(\d+)/', views.t1, name='t1'),

    # 有名分组
    re_path('edit_book/(?P<book_id>\d+)/', views.edit_book, name='edit_book'),
    re_path('t2/(?P<id_1>\d+)/(?P<id_2>\d+)/', views.t2, name='t2'),

]


# 以下自定义几个视图函数来处理自定义错误类型,模板文件名和文件内容可以自定义
from django.shortcuts import render


def bad_request(request, exception):
    """ 400 error handler. """
    return render(request, '400.html')


def permission_denied(request, exception):
    """ Permission denied (403) handler. """
    return render(request, '403.html')


def page_not_found(request, exception):
    """
    404 handler.
    """
    return render(request, '404.html')


def server_error(request):
    """
    500 error handler.
    """
    return render(request, '500.html')


handler400 = bad_request
handler403 = permission_denied
handler404 = page_not_found
handler500 = server_error

that's all, see also:

Django 自定义 404 500 等错误页面 | Django 2.1.7 视图 - 自定义404错误、500错误

posted @ 2021-01-12 09:32  听雨危楼  阅读(142)  评论(0编辑  收藏  举报