如何使Flask_restplus使用来自app_errorhandler的错误处理程序?

时间:2018-12-15 12:45:32

标签: python python-3.x flask flask-restful flask-restplus

我正在尝试在我的API中使用全局错误处理程序(app_errorhandler),但遇到了一些问题。 我有一个错误蓝图,其中定义了定义为以下内容的全局错误:

from werkzeug.exceptions import NotFound
from flask_app.errors import error_bp

@error_bp.app_errorhandler(NotFound)
def not_found_error(error):
    return "Error 404", 404

,这适用于所有应用程序路由,但不适用于flask_restplusflask_restful创建的API(都尝试过)。当我尝试在其中举起NotFound时,我会得到:

  

”在服务器上找不到请求的URL。如果您输入了   手动输入网址,请检查您的拼写,然后再试一次。你有   请求了此URI [/ user / info / 1 /],但您的意思是   / user / info //或/ user / edit //或   / user / login?”

当我在API中将errorhandler定义为:

@user_api.errorhandler(NotFound)
def new_error(error):
    return "Error handler in API 404"

它不是在API中使用此errorhandler,而是在全局API中使用(为什么?如何?),所以我有一种使用app_errorhandler的方法,但这不是解决方案,因为我不想如果我有全局设置,则为每个API定义一个errorhandler。我所有的API都是使用它们所在的蓝图创建的。

所以我的问题是:如何在API中使用app_errorhandler而不在每个API中定义errorhandler

答案可以是flask_restplus或flask_restful,因为我从一个切换到另一个没有问题。预先感谢。

注意: 有很多解决方法,但我认为api应该默认能够使用app的错误,因为blueprints可以使用它们并且api可以继承蓝图

根据Mehdi Sadeghi请求的项目结构和代码:

.
|____flask_test_app
| |____errors
|   |___ __init__.py
|   |___ handlers.py
| |____test_found
|   |___ __init__.py
|   |___ apis.py
| |_____ __init__.py

__init__.py

from flask import Flask

def create_app(config_name):
    app = Flask(__name__)
    app.config.from_object(config_name)

    from .errors import error_bp
    app.register_blueprint(error_bp)

    from .test_found import test_found
    app.register_blueprint(test_found)

    return app

errors.__init__.py

from flask import Blueprint
error_bp = Blueprint('error_bp', import_name='error_bp')

from flask_test_app.errors import handlers

errors.handlers.py

from werkzeug.exceptions import NotFound
from flask_test_app.errors import error_bp

@error_bp.app_errorhandler(NotFound)
def not_found_error(error):
    return "Error 404", 404

test_found.__init__py

from flask import Blueprint
from flask_restplus import Api

test_found = Blueprint('test_found', import_name='test_found',
                       url_prefix='/test_found')

test_found_api = Api(test_found)
from flask_test_app.test_found import apis

test_found.apis.py

from flask_restplus import Resource
from flask_test_app.test_found import test_found, test_found_api
from werkzeug.exceptions import NotFound

@test_found.route('/test_not_found', methods=['GET'])
def test_not_found():
    raise NotFound
    return "Not found does not work"

class TestAPINotFound(Resource):
    def get(self):
        raise NotFound
        return "TEST NOT FOUND FOR APIs"

test_found_api.add_resource(TestAPINotFound,
                      '/test_api_not_found',
                      endpoint='user_test')

1 个答案:

答案 0 :(得分:1)

the docs所述,在烧瓶不动的情况下,您可以将sudo apt-get install libssl-dev 字典传递给api并自定义返回的消息:

errors

此外,它提供了errors = { 'NotFound': { 'message': "Something is missing.", 'status': 404, } } api = Api(app, errors=errors) ,您可以在API的任何位置使用它:

flask_restful.abort

您还可以捕获class HelloWorld(Resource): def get(self): if not self.has_permission(): return flask_restful.abort(403) return {'hello': 'world'} 之类的异常,并如上所述使用NotFound

但是,如果您确实需要自定义错误处理,则可以在调用flask_restful.abort之前将Api子类化并实现自己的错误处理:

flask_restful.abort