flask踩坑记录:Flask-Restful在非调试模式下接管Flask的异常处理

在学习Flask-Restful写API的时候发现了一个奇怪的现象:

当pycharm运行flask时,debug模式和非debug模式下,相同的代码有不同的表现。

非debug模式:

flask踩坑记录:Flask-Restful在非调试模式下接管Flask的异常处理_第1张图片

flask踩坑记录:Flask-Restful在非调试模式下接管Flask的异常处理_第2张图片

故意抛出的自定义异常,竟然报出了HTTP错误。

debug模式:

flask踩坑记录:Flask-Restful在非调试模式下接管Flask的异常处理_第3张图片

flask踩坑记录:Flask-Restful在非调试模式下接管Flask的异常处理_第4张图片

在才是想要的报错。

查找资料之后发现,原来是Flask-Restful的问题。

flask踩坑记录:Flask-Restful在非调试模式下接管Flask的异常处理_第5张图片

非debug模式下,自定义异常被@api.representation统一处理了,没有经过@app.errorhandler,所以才会有两种模式下两种不同的结果。

处理办法是让api只处理HTTPExceptions和Flask-Restful自己定义的错误。

我们需要改写API的error_router方法:

from flask_restful import Api as _Api
from werkzeug.exceptions import HTTPException


class Api(_Api):
    def error_router(self, original_handler, e):
        """ Override original error_router to only handle HTTPExceptions. """
        if self._has_fr_route() and isinstance(e, HTTPException):
            try:
                return self.handle_error(e)
            except Exception:
                pass  # Fall through to original handler
        return original_handler(e)


api = Api()

参考文章:

Flask-Restful在非调试模式下接管Flask的异常处理

你可能感兴趣的:(flask,flask,python,flask-restful)