高级视图_状态码错误处理

错误处理

1、在一些网站开发中,经常会需要捕获一些错误:不论是用户行为引起的错误,还是程序本身的错误都需要我们对其进行很合理的处理

2、既然错误无法避免,那么就需要反馈错误信息,返回错误信息:
    ⑴一方面是为了在应用系统开发阶段,方便调试,添加相应的逻辑处理,提示用户
    ⑵另一方面是应用系统运行时,可能会有潜在的异常风险,错误码能辅助定位和修复问题(日志)

3、HTTP状态码是最常见的,通过提前协商处理服务状态的约定编码。HTTP状态码通常由三个数字组成,第一个数字定义了响应的类别,且只有五种可能值

状态码 范围 含义
1xx 100-101 指示信息–表示请求已接收,继续处理
2xx 200-206  成功–表示请求已被成功接收、理解、接受
3xx 300-305 重定向–信息不完整需要进一步补充
4xx 400-415 客户端错误–请求有语法错误或请求无法实现
5xx 500-505 服务器端错误–服务器未能实现合法的请求

注:
1、通过HTTP状态码,客户端能够有效地获取服务器的响应状态,更好地处理异常情况、提示用户信息

2、错误码和HTTP状态码有异曲同工之处,不同的是错误码约定的是业务逻辑,而HTTP状态码约定的是服务器的响应状态

3、在Web应用的通信过程中,如果HTTP状态码不足以表示服务器的响应状态,可以通过错误码来补充,比如,服务器返回 {'code': 500101, 'message': u'连接数据库错误'}

4、HTTP状态码是一种已经达成共识的约定编码,而错误码需要建立新的约定。在业务逻辑中,也可以通过HTTP状态码表示业务错误状态。错误码和HTTP状态码有交集,但不能相互替代

 

 

Django自定义错误模板

1、通常,我们在访问一个不存在的URL时,服务器返回的状态码是404。但是为更直观的展示给用户,通常服务器会返回一个HTML页面来提示访问的页面不存在
    ⑴也就是返回的这个HTML模板早就定义好了的,只要当访问的URL不存在时,服务器就会自动返回这个模板

2、在前面的学习中,如果遇到了404等错误时,Django返回的是一些报错信息,这个是Django默认开启了调试模式,在实际场景中这样肯定是不行的。因此就需要在遇到错误时,返回一个自己定义好了的模板
    ⑴Django中,如果我们想要在发生错误时返回我们自己定义的模板,那么首先需要将setting.py文件中的"DEBUG = True"的值改为"False",不然返回的还是报错信息

3、在碰到比如404、500错误的时候,想要返回自己定义的模板。那么可以直接在templates文件夹下创建相应错误代码的HTML模板文件。那么以后发生相应错误后,会将指定的模板返回回去

例1:修改默认配置

高级视图_状态码错误处理


例2:
⑴编辑视图

高级视图_状态码错误处理

⑵正常访问

高级视图_状态码错误处理

⑶错误访问

高级视图_状态码错误处理

注:
1、因为我们前面把Django的调试模式改为了False("DEBUG = True"),那么在遇到错误时,就不会返回报错信息了,且我们没有自己定义错误模板,因此就返回的Django自带的错误模板

2、一般来说,在开发阶段通常会把调试模式打开的,毕竟这样方便查找错误信息


例2_1:
⑴定义模板

高级视图_状态码错误处理

⑵错误访问

高级视图_状态码错误处理

注:
1、错误模板的名字必须是对应HTTP状态码的名字,不能是其他的(比如404、500等)

2、可以看到我们在视图函数中根本就没有引用错误模板,但是在发生错误时Django还是自己找到了对应的错误模板。所以说模板的名字很重要
    ⑴模板的名字必须要与对应HTTP状态码名字一致。如果不一致,就会找不到
    ⑵比如发生404错误时就会去找名为404的HTML模板,发生500错误是就会去找名为500的HTML模板


例2_2:
⑴定义视图

高级视图_状态码错误处理

⑵访问:未自定义模板

高级视图_状态码错误处理

⑶定义模板

高级视图_状态码错误处理

⑷访问:自定义模板

高级视图_状态码错误处理

 

 

补充

1、前面我们是将404.html等HTTP状态码模板放在业务APP(polls)下的templates文件夹下的。也就是专门处理错误状态码的HTML文件是跟业务HTML文件放在一起的,这样的话可能就会显得有点混乱

2、因此,我们可以新建一个APP或文件夹来专门存或处理这些错误状态码的HTML模板
    
例3:处理方式1(存放在工程级别下的templates文件夹)
⑴编辑模板

高级视图_状态码错误处理

⑵访问

高级视图_状态码错误处理

注:
1、在Django工程中,每个APP下面可以有自己的templates文件夹,还可以有工程级别的templates文件夹
    ⑴APP下面的templates文件夹:用来存放自己业务模块的HTML文件
    ⑵工程级别下的templates文件夹:用来存放整个项目公用的HTML文件

2、错误状态码的HTTP模板是整个项目都可以用到的,因此就可以把这些错误状态码的HTML文件放到工程级别下的templates文件夹下


例4:处理方式2
⑴创建APP和定义视图函数

高级视图_状态码错误处理

⑵添加URL映射

高级视图_状态码错误处理

⑶添加根URL映射

高级视图_状态码错误处理

⑷编辑视图

高级视图_状态码错误处理

⑸访问

高级视图_状态码错误处理

注:上面介绍了两种方式来更好的存放和处理错误状态码的HTML模板

1、使用工程级templates文件夹:通常这是一个用来存放整个项目都会用到的HTML模板的文件夹,因此可以将错误状态码的HTML模板放在这里面
    ⑴另外整个项目都会用到的HTML模板可能会很多,因此还可以在工程级templates文件夹下继续新建文件夹,比如errors,然后再把错误状态码的HTML模板放到这个errors文件夹下(可以更清楚的区分不同的HTML模板)

2、使用errors应用程序:这种方法实际用到的就是一个URL跳转的逻辑。不过这种处理方式个人感觉麻烦多了
    ⑴当请求符合某些条件时,就把URL重定向到错误状态码的HTML模板