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



我正在尝试在我的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 [/用户/信息/1/],但您的意思是/user/info//or/user/edit//or/用户/登录 ?">

当我在 API 中将errorhandler定义为:

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

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

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

答案可以是flask_restplus的,也可以是flask_restful的,因为我从一个切换到另一个没有问题。提前谢谢。

注意:有很多解决方法,但我认为默认情况下api应该能够使用apps 错误,因为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')

在 flask-restful 中,如文档中所述,您可以将errors字典传递给 API 并自定义返回的消息:

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

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

class CustomApi(Api):
def handle_error(self, e):
# Do something and then abort
flask_restful.abort('some error code...', 'error message')
api = CustomApi(app, errors=errors)

相关内容

  • 没有找到相关文章

最新更新