微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用flask-restx

如何解决使用flask-restx

我对flask-restx 有以下api 定义(尽管也应该与flask-restplus 一起使用)。 有没有办法在没有太多开销或使用 DAO 的情况下将请求正文中的 enum 字段转换为 Enum MyEnum

class MyEnum(Enum):
    FOO = auto()
    BAR = auto()


@dataclass(frozen=True)
class MyClass:
    enum: MyEnum


api = Namespace('ns')

model = api.model('Model',{
    'enum': fields.String(enum=[x.name for x in MyEnum]),})

@api.route('/')
class MyClass(Resource):

    @api.expect(Model)
    def post(self) -> None:
        c = MyClass(**api.payload)
        print(type(c.enum))  # <class 'str'> (but I want <enum 'MyEnum'>)
        assert(type(c.enum) == MyEnum)  # Fails

解决方法

好的,我已经写了一个装饰器,它将用枚举替换枚举值

def decode_enum(api: Namespace,enum_cls: Type[Enum],keys: List[str]):
    def replace_item(obj: dict,keys_: List[str],new_value: Type[Enum]):
        if not keys_:
            return new_value
        obj[keys_[0]] = replace_item(obj[keys_[0]],keys_[1:],new_value)
        return obj

    def decoder(f):
        @wraps(f)
        def wrapper(*args,**kwds):
            value = api.payload
            for k in keys:
                value = value[k]
            enum = enum_cls[value]
            api.payload[keys[0]] = replace_item(api.payload[keys[0]],keys[1:],enum)
            return f(*args,**kwds)
        return wrapper
    return decoder

用法是这样的

@decode_enum(api,MyEnum,['enum'])
@api.expect(Model)
def post(self) -> None:
    c = MyClass(**api.payload)
    print(type(c.enum))  # <enum 'MyEnum'>

replace_item 函数的灵感来自这个 SO 答案:https://stackoverflow.com/a/45335542/6900162

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?