当前位置: 首页 > news >正文

Flask 学习-76.Flask-RESTX 处理异常@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)

相关文章:

  • Java Boolean类中booleanValue()方法具有什么功能呢?
  • c# 与stm32之间结构体的收发
  • java集合专题Map接口及HashMap/Hashtable/Properties使用方法底层结构及源码分析
  • Vue(六)——vuex
  • JavaScript 学习-47.export 和 import 的使用
  • Kafka 生产者
  • Spring核心IOC的核心类解析
  • 【数据挖掘】恒生金融有限公司2023届秋招数据ETL工程师笔试题解析
  • 软件测试分类
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • var、let、const的区别
  • 机器学习(二十九):LightGBM 模型
  • node.js 使用教程-2.Gulp 打包构建入门与使用
  • UMLChina建模竞赛第3赛季第12轮:歌曲知识
  • springboot二手交易平台毕业设计源码290915
  • Angular 2 DI - IoC DI - 1
  • Codepen 每日精选(2018-3-25)
  • Flex布局到底解决了什么问题
  • Javascript Math对象和Date对象常用方法详解
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • Redux系列x:源码分析
  • SOFAMosn配置模型
  • XForms - 更强大的Form
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 从零开始学习部署
  • 关于Flux,Vuex,Redux的思考
  • 基于游标的分页接口实现
  • 技术发展面试
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • 主流的CSS水平和垂直居中技术大全
  • kubernetes资源对象--ingress
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • "无招胜有招"nbsp;史上最全的互…
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #宝哥教你#查看jquery绑定的事件函数
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (python)数据结构---字典
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (剑指Offer)面试题34:丑数
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (顺序)容器的好伴侣 --- 容器适配器
  • (转)程序员技术练级攻略
  • (转)详解PHP处理密码的几种方式
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .NET MVC第五章、模型绑定获取表单数据
  • .NET的数据绑定
  • .Net环境下的缓存技术介绍
  • .py文件应该怎样打开?
  • /deep/和 >>>以及 ::v-deep 三者的区别