1. abort()

abort()函数也叫视图终止函数,用于提前退出一个请求,并用指定的错误码返回。既然是视图终止函数,就是说abort()函数是写在视图中的。那么这个函数就不能处理由于url不合法引起的异常,因为一旦url不合法,是无法进入到视图函数中的。

flask-restful中的 abort() 的代码是封装的 flask 的 abort() 代码。

flask abort() 源码:

def abort(status, *args, **kwargs):
return _aborter(status, *args, **kwargs)

flask-restful 的 abort() 源码:

def abort(http_status_code, **kwargs):
try:
original_flask_abort(http_status_code)
except HTTPException as e:
if len(kwargs):
e.data = kwargs
raise

这里的 original_flask_abort() 即 flask 的 abort()。其实我们也可以自己来封装abort()这个函数,来实现我们需要的功能。

1.1 使用方式一:传递一个错误码

from flask import abort

@app.route("/")
def index():
# abort函数可以提前终止视图函数
abort(404) # 下面这条消息无法打印出来,因为上面abort函数已经终止了这个视图函数的运行。
print("我还在运行ing")
return "Index Page"

参数http_status_code:传递状态码(错误码),必须是标准的http状态码。

直接返回给前端页面一个对应错误码的错误信息。

查看错误码:

from werkzeug.exceptions import default_exceptions
import pprint pprint.pprint(default_exceptions)

结果:

如果是以下列表之外的,会报服务器内部错误:{"message": "Internal Server Error"}

可以看到2xx与3xx并不在此之列。


{400: <class 'werkzeug.exceptions.BadRequest'>,
401: <class 'werkzeug.exceptions.Unauthorized'>,
403: <class 'werkzeug.exceptions.Forbidden'>,
404: <class 'werkzeug.exceptions.NotFound'>,
405: <class 'werkzeug.exceptions.MethodNotAllowed'>,
406: <class 'werkzeug.exceptions.NotAcceptable'>,
408: <class 'werkzeug.exceptions.RequestTimeout'>,
409: <class 'werkzeug.exceptions.Conflict'>,
410: <class 'werkzeug.exceptions.Gone'>,
411: <class 'werkzeug.exceptions.LengthRequired'>,
412: <class 'werkzeug.exceptions.PreconditionFailed'>,
413: <class 'werkzeug.exceptions.RequestEntityTooLarge'>,
414: <class 'werkzeug.exceptions.RequestURITooLarge'>,
415: <class 'werkzeug.exceptions.UnsupportedMediaType'>,
416: <class 'werkzeug.exceptions.RequestedRangeNotSatisfiable'>,
417: <class 'werkzeug.exceptions.ExpectationFailed'>,
418: <class 'werkzeug.exceptions.ImATeapot'>,
422: <class 'werkzeug.exceptions.UnprocessableEntity'>,
423: <class 'werkzeug.exceptions.Locked'>,
428: <class 'werkzeug.exceptions.PreconditionRequired'>,
429: <class 'werkzeug.exceptions.TooManyRequests'>,
431: <class 'werkzeug.exceptions.RequestHeaderFieldsTooLarge'>,
451: <class 'werkzeug.exceptions.UnavailableForLegalReasons'>,
500: <class 'werkzeug.exceptions.InternalServerError'>,
501: <class 'werkzeug.exceptions.NotImplemented'>,
502: <class 'werkzeug.exceptions.BadGateway'>,
503: <class 'werkzeug.exceptions.ServiceUnavailable'>,
504: <class 'werkzeug.exceptions.GatewayTimeout'>,
505: <class 'werkzeug.exceptions.HTTPVersionNotSupported'>}

1.2 使用方式二:传递一个json格式字符串

from flask import abort, jsonify

@app.route("/")
def index():
code = 50000
data = [{"data1": "lalallala", {"data2": "lolololo"}]
json_data = jsonify({"code": code, "data": data})
abort(json_data) # 下面这条消息无法打印出来,因为上面abort函数已经终止了这个视图函数的运行。
print("我还在运行ing")
return "Index Page"

这种方法相当于 return ,直接把传入abort中的数据返回到前端。

1.3 使用方式三:传递一个响应体

from flask import abort, Response

@app.route("/")
def index():
res = Response("Not Found", 404, {"name": "ttytty"}) # Response也可以返回响应体信息
abort(res) # 下面这条消息无法打印出来,因为上面abort函数已经终止了这个视图函数的运行。
print("我还在运行ing")
return "Index Page"

直接返回给前端这个响应体。方式二和方式三很相似。

2. errorhandler

捕捉当前app或蓝图的状态码,然后可以进行自定义处理。

2.1 简单使用:

from flask import jsonify
from . import admin @admin.errorhandler(404)
def error_404(error):
"""这个handler可以catch住所有abort(404)以及找不到对应router的处理请求"""
response = dict(status=0, message="404 Not Found")
return jsonify(response), 404 @admin.errorhandler(Exception)
def error_500(error):
"""这个handler可以catch住所有的abort(500)和raise exeception."""
response = dict(status=0, message="500 Error")
return jsonify(response), 400 class MyError(Exception):
"""自定义错误类"""
pass @admin.errorhandler(MyError)
def MyErrorHandle(error):
response = dict(status=0, message="400 Error")
return jsonify(response), 400

2.2 封装成全局异常捕获处理:

  1. 自定义异常类(有需要的话)

from werkzeug.exceptions import HTTPException class EigenException(HTTPException):
code = 500
eigen_code = 4000
description = 'Inner Server Error' class RequestError(EigenException):
code = 400 class DataNotFound(RequestError):
code = 404
eigen_code = 4004
description = 'Data Not Found' def __init__(self, message):
self.description = '%s Not Found' % message class InvalidRequest(RequestError):
eigen_code = 4005
description = 'Invalid Request URL' class MissingKey(RequestError):
eigen_code = 4006
description = 'Missing Key' def __init__(self, key):
self.description = 'Missing Key `%s`' % key
  1. 捕获异常并处理:

# 制定一个响应
def json_response(code, error, status_code):
response = make_response(json.dumps(dict(code=code, error=error)), status_code)
response.headers['Content-Type'] = 'application/json; charset=utf-8'
return response # 异常捕获处理
@app.errorhandler(Exception)
def handler_exception(e):
if isinstance(e, 其他异常):
code, status_code, error = 4000, 400, e.description
elif isinstance(e, EigenException):
code, status_code, error = e.eigen_code, e.code, e.description
elif isinstance(e, HTTPException):
code, status_code, error = e.code, e.code, e.description
else:
code, status_code, error = 5000, 500, '%s(%s)' % (e.__class__.__name__, str(e))
return json_response(code, error, status_code)

3. app_errorhandler

捕捉全局状态码,并进行自定制异常处理

在蓝本中编写错误处理程序有点不同,如果使用errorhandler修饰器,那么只有蓝本中的错误才会触发。如果想注册全局的错误处理程序,要用app_errorhandler。

例如:


from bookapp import bokkapp @bookapp.app_errorhandler(Exception)
def handler_exception(e):
if isinstance(e, 其他异常):
code, status_code, error = 4000, 400, e.description
elif isinstance(e, EigenException):
code, status_code, error = e.eigen_code, e.code, e.description
elif isinstance(e, HTTPException):
code, status_code, error = e.code, e.code, e.description
else:
code, status_code, error = 5000, 500, '%s(%s)' % (e.__class__.__name__, str(e))
response = dict(code=code, status=status_code, msg=error)
return jsonify(response)

**注意: **当我们不是使用的工厂模式创建app时,app.errorhandler(401),即可捕捉全局401状态;若使用了create_app方式创建app,则无法进行捕捉,若想捕捉,可以在蓝图中写,如admin.errorhandler(401),即捕捉admin蓝图下所有401状态码,admin.app_errorhandler(401),则是捕捉的全局的401状态码,即其他蓝图中的401状态,也会被捕捉,进行处理

参考文章:

  1. https://www.cnblogs.com/huchong/p/9205651.html
  2. https://www.cnblogs.com/fiona-zhong/p/10218338.html

flask异常处理:abort、errorhandler、app_errorhandler,封装全局异常处理的更多相关文章

  1. WCF全局异常处理

    在用wcf做为单纯的服务端的时候,发生错误是常有的事情,特别是在调用其他系统提供的接口的时候,发生的一些错误总是让人摸不着头脑,严重影响了错误的定位.做.net web开发的时候,我们可以在Globa ...

  2. Spring Boot 2.x 系列教程:WebFlux REST API 全局异常处理 Error Handling

    摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 本文内容 为什么要全局异常处理? WebFlux REST 全 ...

  3. 【Flask】abort和errorhandler、app_errorhandler进行请求中断及自定义异常处理

    在view函数中,如果需要中断request,可以使用abort(500)或者直接raise exception.当然我们还需要返回一个出错信息给前端,所以需要定制一下ErrorHandler.一般只 ...

  4. SpringBoot整合全局异常处理&SpringBoot整合定时任务Task&SpringBoot整合异步任务

    ============整合全局异常=========== 1.整合web访问的全局异常 如果不做全局异常处理直接访问如果报错,页面会报错500错误,对于界面的显示非常不友好,因此需要做处理. 全局异 ...

  5. NET MVC全局异常处理(一) 【转载】网站遭遇DDoS攻击怎么办 使用 HttpRequester 更方便的发起 HTTP 请求 C#文件流。 Url的Base64编码以及解码 C#计算字符串长度,汉字算两个字符 2019周笔记(2.18-2.23) Mysql语句中当前时间不能直接使用C#中的Date.Now传输 Mysql中Count函数的正确使用

    NET MVC全局异常处理(一)   目录 .NET MVC全局异常处理 IIS配置 静态错误页配置 .NET错误页配置 程序设置 全局异常配置 .NET MVC全局异常处理 一直知道有.NET有相关 ...

  6. 014-Spring Boot web【三】拦截器HandlerInterceptor、异常处理页面,全局异常处理ControllerAdvice

    一.拦截器HandlerInterceptor 1.1.HandlerInterceptor接口说明 preHandle,congtroller执行前,如果返回false请求终端 postHandle ...

  7. 第6章 AOP与全局异常处理6.5-6.11 慕课网微信小程序开发学习笔记

    https://coding.imooc.com/learn/list/97.html 目录: 第6章 AOP与全局异常处理6-1 正确理解异常处理流程 13:236-2 固有的处理异常的思维模式与流 ...

  8. WPF MVVM UI分离之《交互与数据分离》 基础才是重中之重~delegate里的Invoke和BeginInvoke 将不确定变为确定系列~目录(“机器最能证明一切”) 爱上MVC3系列~全局异常处理与异常日志 基础才是重中之重~lock和monitor的区别 将不确定变成确定~我想监视我的对象,如果是某个值,就叫另一些方法自动运行 将不确定变成确定~LINQ DBML模型可以对

    WPF MVVM UI分离之<交互与数据分离>   在我们使用WPF过程中,不可避免并且超级喜欢使用MVVM框架. 那么,使用MVVM的出发点是视觉与业务逻辑分离,即UI与数据分离 诸如下 ...

  9. Spring中通过java的@Valid注解和@ControllerAdvice实现全局异常处理。

    通过java原生的@Valid注解和spring的@ControllerAdvice和@ExceptionHandler实现全局异常处理的方法: controller中加入@Valid注解: @Req ...

随机推荐

  1. springboot 启动停止脚本

    https://www.cnblogs.com/lovychen/p/6211209.html   参考 centos 转码解决方案: yum install dos2unix dos2unix ** ...

  2. Ueditor文字和echarts图片 生成 word 前端解决方案

    编程就像搭积木,少了任何一个就拼接不起来,所有积木都找到就只剩下调试. 一.echarts  获取图片方法getDataURL  详细配置:https://www.echartsjs.com/zh/a ...

  3. MySQL Execution Plan--使用Query Rewrite

    安装Query Rewrite Plugin 在MySQL的安装目录的share文件夹下,有两个文件用来安装和卸载Query Rewrite Plugin: install_rewriter.sql: ...

  4. (原)netbeans中使用libtorch

    转载请注明处处: https://www.cnblogs.com/darkknightzh/p/11479330.html 说明:第一种方式在netbeans中无法debug代码,设置了断点也不会在断 ...

  5. 解决使用maven clean项目的时候报错,删除target文件夹失败

    背景:jdk1.8 + maven3.5.2 问题描述: 我在使用maven clean项目的时候,celan 失败,报错的原因是删除项目下的target文件夹下面的文件失败 解决方法: 打开任务管理 ...

  6. Nginx 核心配置-location的登录账户认证实战篇

    Nginx 核心配置-location的登录账户认证实战篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.使用ab命令模拟网站攻击 1>.安装httpd-tools工具 ...

  7. locust手机号批量注册性能测试

    from locust import TaskSet,task,HttpLocust from common.redisCon import redis_clusters import queue c ...

  8. JAVA并发-对象方法wait

    最简单的东西,往往包含了最复杂的实现,因为需要为上层的存在提供一个稳定的基础,Object作为java中所有对象的基类,其存在的价值不言而喻,其中wait和notify方法的实现多线程协作提供了保证. ...

  9. jenkins中 Slave使用Docker

    原因就不说了,网上的自动化测试Docker教程太不靠谱,还是学学官网吧. 目的: 在现在各种虚拟化的大条件下,还在建立N个节点机器或节点机器搞N个并发,是不是太不方便了. 如果一个机器搞N个并发,在自 ...

  10. hdu6222——佩尔方程&&大数__int128

    题意 给定一个整数 $N$($1 \leq N \leq 10^{30}$),求最小的整数 $t$,要求 $t \geq N$,使得边长为 $t-1, t, t+1$ 的三角形面积为整数. 分析 根据 ...