• Flask 学习76.FlaskRESTX 处理异常@api.errorhandler 上海


    前言

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

    自定义异常message 内容

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

    from werkzeug.exceptions import BadRequest
    raise BadRequest()
    

    将返回 400 HTTP 代码并输出

    {
        "message": "The browser (or proxy) sent a request that this server could not understand."
    }
    

    可以修改message输出内容

    from werkzeug.exceptions import BadRequest
    raise BadRequest('My custom message')
    

    将输出

    {
        "message": "My custom message"
    }
    

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

    from werkzeug.exceptions import BadRequest
    e = BadRequest('My custom message')
    e.data = {'custom': 'value'}
    raise e
    

    将输出

    {
        "message": "My custom message",
        "custom": "value"
    }
    

    Flask 中止助手

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

    from flask import abort
    abort(400)
    

    将返回 400 HTTP 代码并输出

    {
        "message": "The browser (or proxy) sent a request that this server could not understand."
    }
    

    而这个:

    from flask import abort
    abort(400, 'My custom message')
    

    将输出

    {
        "message": "My custom message"
    }
    

    Flask-RESTX 中止助手

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

    from flask_restx import abort
    abort(400, custom='value')
    

    将返回 400 HTTP 代码并输出

    {
        "message": "The browser (or proxy) sent a request that this server could not understand.",
        "custom": "value"
    }
    

    而这个:

    from flask import abort
    abort(400, 'My custom message', custom='value')
    

    将输出

    {
        "message": "My custom message",
        "custom": "value"
    }
    

    @api.errorhandler装饰器

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

    @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
    

    您还可以记录错误:

    @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。

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

    @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 上注册的错误处理程序。

    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)
    
  • 相关阅读:
    NOJ-1581 筷子 (线性DP)
    UVA-242 Stamps and Envelope Size (DP)
    POJ 1860 (SPFA判断正环)
    POJ 3268 最短路水题
    STL----priority_queue
    STL----unique
    POJ 2031(最小生成树Kruskal算法+几何判断)
    POJ 3468(线段树区间修改+区间求和)
    学习线段树
    POJ 1251(最小生成树裸题)
  • 原文地址:https://www.cnblogs.com/yoyoketang/p/16721876.html
Copyright © 2020-2023  润新知