1-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: