Bridge(支持枚举类型)

简介

如果dealer的参数类型为枚举类型(或者其他非str、int、bool、float类型),需要实现对应的Bridge,然后框架会自动将前端输入转换为枚举对象。如果转换失败,会默认返回400 Bad Request错误。

下面的例子中,如果返回的字段类型为枚举类型,框架会自动转换为枚举对象的value。如果枚举对象有show成员,则框架默认会把枚举对象转化为{'value': ..., 'show': ...}格式的dict。

示例

from lessweb import Application, Model, Bridge, AnySub, Jsonizable, eafp
from enum import Enum

class StrToEnum(Bridge):
    def __init__(self, source: Union[str, int]):
        self.source = eafp(lambda:int(source), source)

    def to(self) -> AnySub(Enum):  # Rank是Enum,但Enum不是Rank。所以要用AnySub,因为AnySub(Enum)是Rank(Gender同理)
        return self.dist(self.source)  # self.dist由框架赋值

class EnumToJson(Bridge):
    def __init__(self, source: Enum):
        self.source = source

    def to(self) -> Jsonizable:
        return {'value': self.source.value, 'show': self.source.show} \
            if hasattr(self.source, 'show') else self.source.value

class Rank(Enum):
    A = 'A'
    B = 'B'
    C = 'C'

class Gender(Enum):
    MALE = 1
    FEMALE = 2

Gender.MALE.show = '男'
Gender.FEMALE.show = '女'

class User(Model):
    id: int
    gender: Gender
    rank: Rank

def add_user(user: User):
    return user

app = Application()
app.add_post_mapping('/user', dealer=add_user)
app.add_bridge(StrToEnum)
app.add_bridge(EnumToJson)
app.run()

请求: curl -X POST -d "id=6&rank=C&gender=1" "http://localhost:8080/user"
返回: {"id": 6, "gender": {"value": 1, "show": "\u7537"}, "rank": "C"}