首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >烧瓶restx格式不正确

烧瓶restx格式不正确
EN

Stack Overflow用户
提问于 2020-06-05 11:06:55
回答 1查看 661关注 0票数 1

问题语境

当使用烧瓶-restx生成api文档时,我在MarshallingError中遇到了一些意想不到的行为。我有一个自定义的烧瓶-restx字段定义,如下所示。

代码语言:javascript
运行
复制
class EnumField(StringMixin, Raw):

    def __init__(self, enum_type, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.enum_type = enum_type

    def format(self, value):
        try:
            return self.enum_type(value)
        except ValueError as e:
            raise MarshallingError(e)

    def output(self, key, obj, **kwargs):
        return self.format(obj[key]).value

其中enum_type很简单,比如

代码语言:javascript
运行
复制
class DemoEnum(Enum):
    a = 'a'
    b = 'b'
    c = 'c'

然后将其打包到restx api.model中,如下所示。

代码语言:javascript
运行
复制
model = api.model('Demo', {"name": EnumField(enum_type=DemoEnum, required=True)})

问题

当我向name中输入一个整数时,正如预期的那样,我得到了一个很好的错误,如下所示。

代码语言:javascript
运行
复制
{
  "errors": {
    "name": "1 is not of type 'string'"
  },
  "message": "Input payload validation failed"
}

但是,当我在枚举中输入一个值,即而不是(例如“d”)时,错误似乎会出现在我的format定义中,但是MarshallingError并没有像预期的那样隐藏所有的内部错误。下面是输出的一个简短片段。

代码语言:javascript
运行
复制
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
  "http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head>
    <title>MarshallingError: 'string' is not a valid DemoEnum // Werkzeug Debugger</title>
...

奎尔斯

这个预期的behaviour?

  • Is是否有可能返回一个更清晰的错误,如上面所示?我的理解是,我对format的定义应该实现这一点??

全面申请测试

代码语言:javascript
运行
复制
from flask_restx import Api, Resource
from flask_restx.fields import Raw, StringMixin, MarshallingError

from flask import Flask
from werkzeug.middleware.proxy_fix import ProxyFix

from enum import Enum

# =============================================================================
# Custom EnumField and Enum
# =============================================================================

class EnumField(StringMixin, Raw):

    def __init__(self, enum_type, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.enum_type = enum_type

    def format(self, value):
        try:
            return self.enum_type(value)
        except ValueError as e:
            raise MarshallingError(e)

    def output(self, key, obj, **kwargs):
        return self.format(obj[key]).value

class DemoEnum(Enum):
    a = 'a'
    b = 'b'
    c = 'c'

# =============================================================================
# Demo restx model
# =============================================================================

app = Flask(__name__)
app.wsgi_app = ProxyFix(app.wsgi_app)
api = Api(app, version='1.0', title='Test API', validate=True)

ns = api.namespace('demo')

model = api.model('Demo', {
    "name": EnumField(enum_type=DemoEnum, required=True)
})

# =============================================================================
# Api endpoint
# =============================================================================

@ns.route('/')
class Demo(Resource):
    @ns.doc('create_demo')
    @ns.expect(model, validate=True)  # validate checks the input is provided
    @ns.marshal_with(model, code=201)
    def post(self):
        '''Create demo'''
        return api.payload

if __name__ == '__main__':
    app.run(debug=True)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-27 01:55:48

  1. 是预期的行为吗?

是的,因为您的函数没有正确中止或返回任何内容。

  1. 是否可能返回一个更清晰的错误,如上面所示?我的理解是,我对格式的定义应该实现这一点?

是的,您可以像您正在做的那样挽救错误,然后返回您自己的消息,并确保它使用abort正确中止。

试试这个:

代码语言:javascript
运行
复制
from flask import Flask, abort


def output(self, key, obj, **kwargs):
    try:
        return self.format(obj[key])
    except (ValueError, MarshallingError) as e:
        return abort(400,  f'Unable to marshal field. errors: [{key}: {str(e)}]')

此示例的输出将是格式化的400错误:

代码语言:javascript
运行
复制
{
  "message": "Unable to marshal field. errors: [name: 'd' is not a valid DemoEnum]"
}

这不会影响来自expect装饰器的错误消息传递,即。如果为name字段输入1,您将收到与前面相同的消息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62213923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档