跟我学Flask(五)-异常处理与请求钩子

在开始讲解异常处理之前,先科普一下常见的状态码

一、网站常见状态码

Type Reason-phrase Note
1XX Informational 信息性状态码,表示接受的请求正在处理
2XX Success 成功状态码,表示请求正常处理完毕
3XX Redirection 重定向状态码,表示需要客户端需要进行附加操作
4XX Client Error 客户端错误状态码,表示服务器无法处理请求
5XX Server Error 服务器错误状态码,表示服务器处理请求出错

301 - 已永久移动
302 - 对象已移动。
304 - 未修改。
400 - 错误的请求。
401 - 访问被拒绝。
403 - 禁止访问。
404 - 未找到。
500 - 内部服务器错误。
503 - 服务不可用。这个错误代码为 IIS 6.0 所专用。
504 - 网关超时。
505 - HTTP 版本不受支持。

二、异常处理(abort)

flask中的异常处理:abort函数,类似python中raise语句,抛出异常

1、abort只能抛出符合http协议的异常状态码

2、abort一旦被触发,终止程序运行,直接返回了响应报文,后面的代码不会执行。

@app.route('/')
def index():
    # 400坏的请求
    # 403没有权限
    # 404找不到
    # 405请求方法不允许
    # try:
    #     查询数据库
    # except Exception as e:
    #     abort(500)
    abort(500)
    return 'hello world',400

if __name__ == '__main__':
    app.run(debug=True)

三、自定义错误界面

# 自定义错误页面,errorhandler接收的参数为异常状态码
# 1、errorhandler修饰的函数必须接受错误信息作为参数,可以不返回

@app.errorhandler(500)
def err_handler(e):
    return '服务器搬家了,请访问*****链接'

四、请求钩子

在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如:

  • 在请求开始时,建立数据库连接;
  • 在请求开始时,根据需求进行权限校验;
  • 在请求结束时,指定数据的交互格式;

为了让每个视图函数避免编写重复功能的代码,Flask提供了通用设施的功能,即请求钩子。

请求钩子是通过装饰器的形式实现,Flask支持如下四种请求钩子:

请求钩子所指的异常是服务器内部代码出现的异常,手动抛出或者请求异常不会被钩子识别

  • before_first_request
    • 在处理第一个请求前执行
  • before_request
    • 在每次请求前执行
    • 如果在某修饰的函数中返回了一个响应,视图函数将不再被调用
  • after_request
    • 如果没有抛出错误,在每次请求后执行
    • 接受一个参数:视图函数作出的响应
    • 在此函数中可以对响应值在返回之前做最后一步修改处理
    • 需要将参数中的响应在此参数中进行返回
  • teardown_request:
    • 在每次请求后执行
    • 接受一个参数:错误信息,如果有相关错误抛出
from flask import Flask
from werkzeug.routing import Rule,Map,MapAdapter,BaseConverter
app = Flask(__name__)

@app.route('/')
def index():
    print('index run---')
    # abort(400)
    return 'hello world'

# 请求钩子:四种,两种在请求前执行,两种在请求后执行

# 请求前执行
# before_first_request在第一次请求前执行,只执行一次。
@app.before_first_request
def befor_firt_request():
    print('before first request run---')

# 在每次请求前都执行
@app.before_request
def before_request():
    print('before request run---')

# 请求后执行
# after_request:没有异常的情况下,在每次请求后执行,接收的参数为响应对象
@app.after_request
def after_request(response):
    print('after request run---')
    # 修改响应的类型
    response.headers['Content-Type'] = 'application/json'
    return response

# teardown_request:即使有异常,在每次请求后执行,接收的参数为异常信息
@app.teardown_request
def teardown_reqeust(e):
    print('teardown request run---')


# 异常:可以通过手动触发实现异常吗?abort(400)
# 异常到底是指什么异常?

if __name__ == '__main__':
    print(app.url_map)
    app.run(debug=True)

猜你喜欢

转载自blog.csdn.net/qq_36217796/article/details/83794066