![21. Django 2.1.7 视图 - 自定义404错误、500错误_Python](https://s2.51cto.com/images/blog/202106/18/07c03fb97d69f2e4a723262f0603e163.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
上一篇Django 2.1.7 模型管理器 models.Manager 以及 元选项
讲述了关于Django模型管理类以及如何设置表名、字段名的元选项内容。
在了解了Django的模型相关知识点之后,那么再来详细看看Django的视图。 前面我也基本写了Django 2.1.7 视图,讲解了url地址的转发配置,参数获取等内容。
那么本篇章再看看如何自定义404错误、500错误等错误页。
参考文献
https://docs.djangoproject.com/zh-hans/2.1/ref/views/
首先看看开启了调试模式的Django错误页
![21. Django 2.1.7 视图 - 自定义404错误、500错误_Django教程_02](https://s2.51cto.com/images/blog/202106/18/f9422e2eb73dafb3863cd21f1999e8cd.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
任意访问一个不存在的url路径,Django在调试模式下就会返回错误信息。那么下面来关闭调试模式。
关闭调试模式
打开项目/settings.py文件,修改以下两项:
DEBUG = True
ALLOWED_HOSTS = []
改为
DEBUG = False
ALLOWED_HOSTS = ['127.0.0.1']
其中放行的 ALLOWED_HOSTS 则是允许访问的域名或者IP地址,如果所有都放行可以配置ALLOWED_HOSTS = ['*']。不然会报错如下:
F:\pythonProject\django-pratice>python3 manage.py runserver
CommandError: You must set settings.ALLOWED_HOSTS if DEBUG is False.
重启启动服务,访问刚才不存在的url路径,如下:
![21. Django 2.1.7 视图 - 自定义404错误、500错误_Django教程_03](https://s2.51cto.com/images/blog/202106/18/128bd47302da2ae342eec34ed26aab86.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
可以看到Django默认的404错误页了,显然不是很好看,那么我能不能自定义这个页面呢?
自定义404页面
自定义404页面当然是可以的,这个首先需要理解Django的模板的html查找顺序。 Django的模板首先是在项目setting配置的模板路径进行优先第一个查看,然后再看应用下有没有配置templates路径,如果有则进入查看,如果没有,则进入最后Django内置的模板路径下去查找html。
那么说了那么多,怎么去自定义404错误页面?
其实只需要在模板路径下建立一个404.html页面即可,因为只要在第一优先模板路径找到了,Django也不会继续往下查找了。
在模板下创建一个404.html
![21. Django 2.1.7 视图 - 自定义404错误、500错误_Python_04](https://s2.51cto.com/images/blog/202106/18/33e9376e6793cb4a78d4531dc64c2fd2.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
再次访问页面看看是不是出现自定义的404错误页,如下:
![21. Django 2.1.7 视图 - 自定义404错误、500错误_Python_05](https://s2.51cto.com/images/blog/202106/18/a92ced5d7a4e2c26d71942ac1c3e047f.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
可以看到已经是返回自定义的404错误页了。
而且使用内置的模板变量{{ request_path }}还可以设置查看这个访问的错误路径,如下:
![21. Django 2.1.7 视图 - 自定义404错误、500错误_Python_06](https://s2.51cto.com/images/blog/202106/18/aacf3b82361c455c5ba3e93edabff910.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
页面访问如下:
![21. Django 2.1.7 视图 - 自定义404错误、500错误_Django教程_07](https://s2.51cto.com/images/blog/202106/18/395bb276ea26e560582f182cdcfa5a2d.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
那么其他500,503等错误页是不是也是一样的做法呢?当然是的。
自定义500页面 - 视图出错
当视图内的参数之类发生错误,访问则会提示如下:
![21. Django 2.1.7 视图 - 自定义404错误、500错误_Django教程_08](https://s2.51cto.com/images/blog/202106/18/f2eecdb54483afae09d09096bffd29a3.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
下面也对这个500错误页面进行自定义,如下:
![21. Django 2.1.7 视图 - 自定义404错误、500错误_Django教程_09](https://s2.51cto.com/images/blog/202106/18/6ca7883f392fc5ae115a8d572eaa9ed9.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
浏览器访问如下:
![21. Django 2.1.7 视图 - 自定义404错误、500错误_Django教程_10](https://s2.51cto.com/images/blog/202106/18/6fed612f1fae979ddd0d66401b7b1376.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
优化错误页面
上面的两个示例错误页面肯定是不好看的,当然要优化一下,如下:
![21. Django 2.1.7 视图 - 自定义404错误、500错误_Python_11](https://s2.51cto.com/images/blog/202106/18/9cc49fcfd3424ed19f650ccdd1b63000.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
![21. Django 2.1.7 视图 - 自定义404错误、500错误_Django教程_12](https://s2.51cto.com/images/blog/202106/18/5bedac1f4633ed32c02c5cc9f0f32058.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
在这里要注意一下,关闭调试模式后,默认static静态文件Django是不提供服务的,需要改变未非安全的启动方式才会提供,如下:
python3 manage.py runserver --insecure
增加--insecure参数。