在Flask view函数中,如果需要中断request,可以使用abort(500)或者直接抛异常raise exception。当然我们还需要返回一个出错信息给前端,所以需要定制一下errorhandler。一般只需要两个handler即可,一个是404错误,一个是500一类的服务器端错误。当然也可以自定义错误。
一、abort中断请求
# 在flask中可以使用abort中断请求,触发请求对应的状态码
from flask import abort
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
abort(404) # 请求到此即中断,不会打印下面的语句,并返回HTTP状态码401
print("NOK")
if __name__ == '__main__':
app.run()
二、errorhandler捕捉当前app或蓝图的状态码,并进行自定制处理
bp是一个蓝图,发生404、500错误时,返回对应的404、500错误页面
from flask import render_template
from mytools.errors import bp
@bp.errorhandler(404)
def not_found_error(error):
return render_template('errors/404.html')
@bp.errorhandler(500)
def internal_error(error):
return render_template('errors/500.html')
三、app_errorhandler捕捉全局状态码,并进行自定制异常处理
使用errorhandler修饰器,那么只有本蓝图中的错误才会触发。如果想注册全局的错误处理程序,要用app_errorhandler。
from flask import render_template
from mytools.errors import bp
@bp.app_errorhandler(404)
def not_found_error(error):
return render_template('errors/404.html')
@bp.app_errorhandler(500)
def internal_error(error):
return render_template('errors/500.html')
四、补充说明
当我们不是使用的工厂模式创建app时,app.errorhandler(401),即可捕捉全局401状态;若使用了工厂模式create_app方式创建app,则无法进行捕捉,若想捕捉,可以在蓝图中写,如admin.errorhandler(401),即捕捉admin蓝图下所有401状态码,admin.app_errorhandler(401),则是捕捉的全局的401状态码,即其他蓝图中的401状态,也会被捕捉,进行处理。