Flask 烧瓶全局异常处理
如何使用Flask全局处理异常?我找到了使用以下方法处理自定义db交互的方法:Flask 烧瓶全局异常处理,flask,Flask,如何使用Flask全局处理异常?我找到了使用以下方法处理自定义db交互的方法: try: sess.add(cat2) sess.commit() except sqlalchemy.exc.IntegrityError, exc: reason = exc.message if reason.endswith('is not unique'): print "%s already exists" % exc.params[0] s
try:
sess.add(cat2)
sess.commit()
except sqlalchemy.exc.IntegrityError, exc:
reason = exc.message
if reason.endswith('is not unique'):
print "%s already exists" % exc.params[0]
sess.rollback()
try
-的问题在于,我必须在代码的各个方面运行它。我可以为自定义代码找到更好的方法。我的问题更多地针对以下方面的全球捕获和处理:
apimanager.create_api(
Model,
collection_name="models",
**base_writable_api_settings
)
我发现这个apimager
接受validation\u异常
:[ValidationError
]但是我没有发现使用过这样的例子
我仍然希望使用一个简单的概念“如果此错误:显示此错误,如果另一个错误:显示其他错误”,来实现影响所有db交互的更高级别的处理,该概念仅在所有交互/异常上自动运行,而无需我将其包含在每个apimager
(我想把它放在我的base\u writable\u api\u设置中可以了)。(IntegrityError
,namererror
,DataError
,DatabaseError
,等等)我倾向于在应用程序上设置一个错误处理程序,将异常格式化为json响应。然后您可以创建自定义异常,如UnauthorizedException
class Unauthorized(Exception):
status_code = 401
@app.errorhandler(Exception)
def _(error):
trace = traceback.format_exc()
status_code = getattr(error, 'status_code', 400)
response_dict = dict(getattr(error, 'payload', None) or ())
response_dict['message'] = getattr(error, 'message', None)
response_dict['traceback'] = trace
response = jsonify(response_dict)
response.status_code = status_code
traceback.print_exc(file=sys.stdout)
return response
您还可以使用此模式处理特定异常
@app.errorhandler(ValidationError)
def handle_validation_error(error):
# Do something...
错误处理程序连接到应用程序,而不是apimanager
app = Flask()
apimanager = ApiManager(app)
...
使用该应用程序对象将其放置在某个位置。我首选的方法是使用视图函数
您可以定义如下所示的装饰器:
def handle_exceptions(func):
@wraps(func)
def wrapper(*args, **kwargs):
try:
return func(*args, **kwargs)
except ValidationError:
# do something
except HTTPException:
# do something else ...
except MyCustomException:
# do a third thing
然后,您可以简单地装饰视图功能,例如
@app.route('/')
@handle_exceptions
def index():
# ...
不幸的是,我不知道为传递视图函数而提供的hooks\n服务。是相关文档!您能告诉我如何将其连接到:apimager.create\u api(Model,collection\u name=“models”,**base\u writable\u api\u settings)目前,我的目标是获取适用于所有api_管理器的IntegrityError自定义消息。code base_api_设置={“排除_列”:['password'、'user.password'、'groups'、'registration_token'、'user.registration_token']、“每个页面的最大结果数”:100,“验证_异常”:[ValidationError]}
我尝试了几种不同的方法。每次我提交一个重复的条目,我都会得到标准:{“message”:“IntegrityError”}这是一个粘贴箱:谢谢你的帮助。这是我的框架lol中一个非常烦人的添加。