前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Flask 学习-76.Flask-RESTX 处理异常@api.errorhandler

Flask 学习-76.Flask-RESTX 处理异常@api.errorhandler

作者头像
上海-悠悠
发布2022-09-27 16:59:57
7770
发布2022-09-27 16:59:57
举报
文章被收录于专栏:从零开始学自动化测试

前言

Flask-RESTX 接口返回400,405会以JSON格式返回,像400,500返回的是html格式

自定义异常message 内容

Werkzeug HTTPException 会自动正确地重新使用描述属性进行序列化。

代码语言:javascript
复制
from werkzeug.exceptions import BadRequest
raise BadRequest()

将返回 400 HTTP 代码并输出

代码语言:javascript
复制
{
    "message": "The browser (or proxy) sent a request that this server could not understand."
}

可以修改message输出内容

代码语言:javascript
复制
from werkzeug.exceptions import BadRequest
raise BadRequest('My custom message')

将输出

代码语言:javascript
复制
{
    "message": "My custom message"
}

您可以通过为异常提供数据属性来将附加属性附加到输出。

代码语言:javascript
复制
from werkzeug.exceptions import BadRequest
e = BadRequest('My custom message')
e.data = {'custom': 'value'}
raise e

将输出

代码语言:javascript
复制
{
    "message": "My custom message",
    "custom": "value"
}

Flask 中止助手

将abort错误正确地包装到 HTTPException 中,因此它将具有相同的行为。

代码语言:javascript
复制
from flask import abort
abort(400)

将返回 400 HTTP 代码并输出

代码语言:javascript
复制
{
    "message": "The browser (or proxy) sent a request that this server could not understand."
}

而这个:

代码语言:javascript
复制
from flask import abort
abort(400, 'My custom message')

将输出

代码语言:javascript
复制
{
    "message": "My custom message"
}

Flask-RESTX 中止助手

errors.abort()和助手的工作Namespace.abort()方式与原始 Flask 类似,flask.abort() 但它也会将关键字参数添加到响应中。

代码语言:javascript
复制
from flask_restx import abort
abort(400, custom='value')

将返回 400 HTTP 代码并输出

代码语言:javascript
复制
{
    "message": "The browser (or proxy) sent a request that this server could not understand.",
    "custom": "value"
}

而这个:

代码语言:javascript
复制
from flask import abort
abort(400, 'My custom message', custom='value')

将输出

代码语言:javascript
复制
{
    "message": "My custom message",
    "custom": "value"
}

@api.errorhandler装饰器

装饰器@api.errorhandler允许您为给定的异常(或从它继承的任何异常)注册特定的处理程序,其方式与使用 Flask/Blueprint@errorhandler装饰器的方式相同。

代码语言:javascript
复制
@api.errorhandler(RootException)
def handle_root_exception(error):
    '''Return a custom message and 400 status code'''
    return {'message': 'What you want'}, 400

@api.errorhandler(CustomException)
def handle_custom_exception(error):
    '''Return a custom message and 400 status code'''
    return {'message': 'What you want'}, 400

@api.errorhandler(AnotherException)
def handle_another_exception(error):
    '''Return a custom message and 500 status code'''
    return {'message': error.specific}

@api.errorhandler(FakeException)
def handle_fake_exception_with_header(error):
    '''Return a custom message and 400 status code'''
    return {'message': error.message}, 400, {'My-Header': 'Value'}

@api.errorhandler(NoResultFound)
def handle_no_result_exception(error):
    '''Return a custom not found error message and 404 status code'''
    return {'message': error.specific}, 404

您还可以记录错误:

代码语言:javascript
复制
@api.errorhandler(FakeException)
@api.marshal_with(error_fields, code=400)
@api.header('My-Header',  'Some description')
def handle_fake_exception_with_header(error):
    '''This is a custom error'''
    return {'message': error.message}, 400, {'My-Header': 'Value'}

@api.route('/test/')
class TestResource(Resource):
    def get(self):
        '''
        Do something

        :raises CustomException: In case of something
        '''
        pass

在此示例中,raise将自动提取文档字符串,并正确记录响应 400。

它还允许在不使用参数时覆盖默认错误处理程序:

代码语言:javascript
复制
@api.errorhandler
def default_error_handler(error):
    '''Default error handler'''
    return {'message': str(error)}, getattr(error, 'code', 500)

Flask-RESTX 默认会在错误响应中返回一条消息。如果需要自定义响应作为错误并且不需要消息字段,则可以通过在应用程序配置中设置ERROR_INCLUDE_MESSAGE为来禁用它。False

错误处理程序也可以在命名空间上注册。在命名空间上注册的错误处理程序将覆盖在 api 上注册的错误处理程序。

代码语言:javascript
复制
ns = Namespace('cats', description='Cats related operations')

@ns.errorhandler
def specific_namespace_error_handler(error):
    '''Namespace error handler'''
    return {'message': str(error)}, getattr(error, 'code', 500)

2022年第 12期《python接口web自动化+测试开发》课程,9月17号开学!

本期上课时间:2022年9月17号 - 2022年12月17号,周六周日上午9:00-11:00

报名费:报名费3000一人(周期3个月)

联系微信/QQ:283340479

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-09-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 从零开始学自动化测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 自定义异常message 内容
  • Flask 中止助手
  • Flask-RESTX 中止助手
  • @api.errorhandler装饰器
    • 报名费:报名费3000一人(周期3个月)
      • 联系微信/QQ:283340479
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档