错误处理器扩展点¶
描述¶
这个扩展点缩写为errhandler。
错误处理器,这个扩展点也很简单,通过register返回errhandler字段,这个字段要求格式是{http-code: error-view-func, other-code: other-error-view-func},键是标准的HTTP代码,值是错误处理函数,支持多个错误代码处理。
不过,现在新增一种格式:[{error=exception_class, handler=func}, {error=err_code,handler=func}],这种形式允许你使用http-code处理错误码,同时允许传入一个自定义的异常类和相关的处理器(捕获这个异常类的处理函数),请参考Flask文档编写这种基于类的形式的代码。
Flask-PluginKit通过 _error_handler()
加载errhandler,这个方法会检测errhandler规则及其内容。
需要注意的是,如果多个重复的错误处理函数,最终会被覆盖,仅一个有效。错误处理函数的编写可以参考官方文档是 flask-error-handlers 。
示例¶
注册errhandler
from flask import jsonify
def permission_deny(error):
return jsonify(dict(status=403, msg="permission deny")),403
class ApiError(Exception):
def __init__(self, code, message, status_code=200):
super(ApiError, self).__init__()
self.code = code
self.message = message
self.status_code = status_code
def to_dict(self):
return dict(code=self.code, msg=self.message)
def handle_api_error(e):
#: e is an instance of an exception class
response = jsonify(e.to_dict())
response.status_code = e.status_code
return response
def raise_api_error_view():
#: Actively triggering ApiError in the view will be intercepted by
#: handle_api_error and return json response.
raise ApiError(10000, "err_message")
def register():
return {
'vep': dict(rule='/api_error', view_func=raise_api_error_view),
'errhandler': [
dict(error=403, handler=permission_deny),
dict(error=ApiError, handler=handle_api_error)
]
}