flask异常处理
对于异常,通常可以分为两类:一类是可以预知的异常,我们通常会用try...except....捕捉,第二类是未知的error,我们是无法预知的。
try:
code block
except A:
except A handle
except:
other except
else:
if no exception, excute here
finally:
code
对于try....except捕捉异常,如果在try中发生了异常,会在except中捕捉到,并处理。如果没有发生异常,会执行else语句
但是不论异常是否发生,都会执行finally语句,所以我们一般会在finally语句中释放资源。
但是,如果所有的代码中我们都加上各种异常捕获,会显得代码比较啰嗦,其实我们是可以将异常处理的逻辑提取出来,统一处理的。
1)下面我们先自定义已知异常处理,继承自werkzeug.exceptions下面的HTTPException
from flask import request, json
from werkzeug.exceptions import HTTPException
def APIException(HTTPException):
code = 500
msg = "sorry, we made a mistake"
error_code = 500
def __init__(msg=None, code=None, error_code=None):
if code:
self.code=code
if msg:
self.msg=msg
if error_code:
self.error_code = error_code
super(APIException, self).__init__(self.msg, None)
# 根据restful的特性,需要不论输入还是输出都需要是json格式,所以我们这里重写get_body方法,将返回值定义为json格式
def get_body(self, environ):
resp = dict(
msg = self.msg,
error_code = self.error_code,
request = request.method + " "+ self.get_url_without_param() # 告诉前端,是哪个接口除了问题
)
return json.dumps(resp)
# 重写get_header方法,告诉浏览器返回的是json格式,按照json格式解析
def get_header():
return [("content-type","application/json")]
@staticmethod
def get_url_without_param():
full_url = str(request.full_path)
main_url = full_url.split("?")
return main_url[0]
要使用我们的APIException也是很简单的,如要处理参数异常,我们可以定义一个ParamError的类,继承自APIException
class ParamError(APIException):
code =400
msg = "invalid parameters"
error_code = 1000 # 自定义
然后在捕获到参数异常的时候,直接抛出我们自定义的ParamError()即可
如果是前端传递过来的参数验证出异常的话,要使用我们的ParamException,需要手动的抛出异常,但是默认的wtforms会将错误信息放到errors中,而不会抛出异常,所以我们还需要重写wtforms的验证方法
from wtforms import Form
class BaseForm(Form):
def __init__(self, data):
# 调用父类的init方法
super(BaseForm, self).__init__(data = data)
def validate_for_api(self,):
# 调用父类的验证方法,如果验证有问题,主动抛出ParamError异常 并将errors作为msg参数传递过去
valid = super(BaseForm, self).validate()
if not valid:
# 这里的self 就是我们常规说的验证的form
raise ParamError(msg = self.errors)
return self
后面所有form直接继承此BaseForm即可,然后在要验证参数的地方调用重写的validate_for_api即可。
2)我们定义个全局函数去统一处理所有的异常
from werkzeug.exceptions import HTTPException
# 使用装饰器去捕捉异常
@app.errorhandler(Exception)
def errorHandler(e):
if isinstance(e, APIException):
# 已知异常
return e
if isinstance(e, HTTPException):
# HTTP异常
code = e.code
msg = e.description
error_code = 1007 # 自定义
return APIException(msg, code, error_code)
else:
# 其他未知异常,此处需要分是生产环境还是开发环境,如果是生产环境,返回json格式的异常,如果是开发环境,我们需要详细的异常说明去分析异常原因
if not app.config["DEBUG"]:
return ServerError() # 类似于上面定义的ParamError,自定义ServerError的code和msg
else:
raise e
这样全局异常就处理完成,不论是发生何种异常,我们都能捕捉到并进行处理了。
flask异常处理的更多相关文章
- flask异常处理:abort、errorhandler、app_errorhandler,封装全局异常处理
目录 1. abort() 1.1 使用方式一:传递一个错误码 1.2 使用方式二:传递一个json格式字符串 1.3 使用方式三:传递一个响应体 2. errorhandler 2.1 简单使用: ...
- 【Flask】abort和errorhandler、app_errorhandler进行请求中断及自定义异常处理
在view函数中,如果需要中断request,可以使用abort(500)或者直接raise exception.当然我们还需要返回一个出错信息给前端,所以需要定制一下ErrorHandler.一般只 ...
- flask模板,路由,消息提示,异常处理
1.flask的路由与反向路由 from flask import Flask, request, url_for app = Flask(__name__) @app.route('/') def ...
- Flask开发技巧之异常处理
Flask开发技巧之异常处理 目录 Flask开发技巧之异常处理 1.Flask内置异常处理 2.HTTPException类分析 3.自定义异常处理类 4.方便的定义自己的错误类 5.注意事项 本人 ...
- Flask的socket.error:10053
一脸懵逼: 学习python一段时间,最近使用flask搭建了一个服务器,然后使用phantom(相当于浏览器)发送请求发送了几条flask就挂掉了,报错信息如下: 由于个人python经验不是很足, ...
- flask 添加日志
def add_error_handler(app): for exception in default_exceptions: app.register_error_handler(exceptio ...
- Inside Flask - app.py - 1
Inside Flask - app.py - 1 除 werkzeug 和 jinja2 等依赖库外,app.py 是在 Flask 的 __init__.py 中导入的第一个 Flask 自身的模 ...
- Python之Flask Web开发
下载python包管理工具Pip: 访问网址:https://pip.pypa.io/en/stable/installing/ 下载文件get-pip.py到本地计算机 定位到get-pip. ...
- Flask中全局变量的实现
我们都知道在Flask中g,request,session和request是作为全局对象来提供信息的,既然是全局的又如何保持线程安全呢,接下来我们就看看flask是如何做到这点的.在源码中的ctx.p ...
随机推荐
- The content of element type "package" must match "(result-types?,interceptors?,default-interceptor-ref?,default-action-ref?,default-class-ref?,global- results?,global-exception-mappings?,action*)".
报错 The content of element type "package" must match "(result-types?,interceptors?,def ...
- BurpSuit2.0专业版破解
简介 Burp Suite 是用于攻击web 应用程序的集成平台.它包含了许多Burp工具,这些不同的burp工具通过协同工作,有效的分享信息,支持以某种工具中的信息为基础供另一种工具使用的方式发起攻 ...
- Spring基于注解注入的两种方式
1.@Autowried 1)默认基于类型查找容器的的Bean进行注入(注入的Bean的实现类是唯一的). 2)当实现类的Bean大于一个的时候,需结合@Qualifier,根据Bean的名称来指定需 ...
- 纯JS编写打地鼠游戏
这个游戏是本人前不久刚入门编写的游戏,感觉里面代码很LOW但是对于新手来说很一般般吧~ 没有上传音乐文件了 运行效果: 上代码(HTML+JS): <!DOCTYPE html> < ...
- 洗礼灵魂,修炼python(75)--全栈项目实战篇(3)—— 账户注册登录管理系统
要求: 1.系统可以创建用户和登录用户,根据用户的输入不同,做出不同的反应(创建还是登录) 2.创建用户不能创建已存在的用户名 3.登录用户的操作最多只能有三次,超过三次冻结账户,每使用一次提示用户还 ...
- selenium RC 环境配置
摘自http://www.cnblogs.com/sanzangTst/p/7452922.html 收藏学习 学习selenium python需要的工具: 1.浏览器 2.Python 3.Sel ...
- http: server gave HTTP response to HTTPS client & Get https://192.168.2.119/v2/: dial tcp 192.168.2.119:443: getsockopt: connection refused
http: server gave HTTP response to HTTPS client 出现这问题的原因是:Docker自从1.3.X之后docker registry交互默认使用的是HTTP ...
- 接入天猫精灵auth2授权页面https发送ajax请求
已存在一个应用A,采用的是http交互, 在接入天猫精灵时,要求请求类型是https,所以在应用服务前加了个nginx转发https请求.在绑定授权页面,会发送ajax请求验证用户名和密码,采用htt ...
- JavaScript中浅拷贝和深拷贝的区别和实现
深拷贝和浅拷贝的区别 浅拷贝(shallow copy):只复制指向某个对象的指针,而不复制对象本身,新旧对象共享一块内存: 深拷贝(deep copy):复制并创建一个一摸一样的对象,不共 ...
- 测试一下robotgo自动化操作,顺便解决了原来的mingw版本中只有gcc,没有g++的问题
参考:https://gitee.com/veni0/robotgo#examples 但是编译不成功 找到这个:https://gitee.com/veni0/robotgo#examples ( ...