在项目开发中难免会出现404(page not found)的情况,本身是有利于开发者开发,但是在上线后就必须关闭开发者模式,再出现的404就不能是开发者模式的了,否则让用户就看到了底层的源代码。
此时我们需要自己写404界面,当出现404的时候,让它展示我们配置的404界面即可。
假如我们写好了超级简单的404.html,并把它放在templates文件夹下
<body>
<h1>抱歉,您请求的页面不存在h1>
body>
下面我们先配置settings
DEBUG = False # 开发环境下为True,此时我们改为False
ALLOWED_HOSTS = ['*'] # 访问地址,127.0.0.1,自己的ip,如172.21.21.21(随便写的),...
在views.py中添加404、500的处理函数
# 404
def page_not_found(request, exception): # 注意点 ①
return render(request, '404.html')
# 500
def page_error(request):
return render(request, '500.html')
在全局urls.py中配置url
from django.conf.urls import url
from index.views import page_not_found, page_error
urlpatterns = [
...
]
handler404 = 'index.views.page_not_found'
handler500 = 'index.views.page_error'
# 书写格式 handler404 名字不可以改。值的格式:app名称.views.函数名
# 或直接 handler404 = page_not_found 这里没有引号(前提, import 导入 page_not_found )
我当时用的是Django==2.2.1版本,刚开始并没有开文档,写法如下:
def page_not_found(request):
return render(request, '404.html')
此时就会报错:
ERRORS:
?: (urls.E007) The custom handler404 view 'index.views.page_not_found'
does not take the correct number of arguments (request, exception).
System check identified 1 issue (0 silenced).
错误信息已经告诉我们了,page_not_found函数缺少一个参数(request, exception),而我写的只有一个request,所以多传一个参数exception就可以了。
在配置完以上后输入一个不存在的地址看一下结果:
如 输入 127.0.0.1:8000/qqq
在404、500配置好后,突然发现图片、css、js等都加载失败了,样式全乱套了。
在关闭开发者模式后会丟失静态文件,我们就需要自己配置一下了。
在settings.py中
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static').replace('\\', '/')
在url.py中加入path
from django.conf.urls import url
from apps.index.views import page_not_found, page_error
from rentingHouse.settings import STATIC_ROOT
from django.views import static
urlpatterns =
...
url('^static/(?P.*)$' , static.serve, {'document_root': STATIC_ROOT}, name='static'),
]
handler404 = 'index.views.page_not_found'
handler500 = 'index.views.page_error'
本节完。