Bridge(对象转JSON)

概述

Bridge

调用app.add_request_bridge(self, bridge_func: RequestBridgeFunc)方法,用于框架在输入时进行类型转换。

调用app.add_response_bridge(self, bridge_func: ResponseBridgeFunc)方法,用于框架在输出时进行类型转换。

在每次类型转换时,会触发第一个没返回None的bridge函数。

RequestBridgeFunc的定义

RequestBridgeFunc = Callable[[Union[ParamStr, Jsonizable], Type], Any]

ResponseBridgeFunc的定义

ResponseBridgeFunc = Callable[[Any], Jsonizable]

Jsonizable类型

框架自带的Jsonizable的定义为

Jsonizable = Union[str, int, float, Dict, List, None]

注意int是Jsonizable,但Jsonizable不是int,其他类型同理。Union[...]中不包含bool是因为bool是int的子类。

示例

from typing import List
from lessweb import Application

class Pair:
    def __init__(self, x, y):
        self.x = x
        self.y = y

class PairPlus:
    x: int = 0
    y: Pair
    _z: int = -1

    @staticmethod
    def of(pair)->'PairPlus':
        ret = PairPlus()
        ret.y = pair
        return ret

def dump_complex(obj) -> str:
    if isinstance(obj, complex):
        return str(obj)

def dump_pair(obj) -> List:
    if isinstance(obj, Pair):
        return [obj.x, obj.y]

app = Application()
app.add_get_mapping('/pair', dealer=lambda: PairPlus.of(Pair(3, 3+2j)))
app.add_response_bridge(dump_complex)
app.add_response_bridge(dump_pair)
app.run()

请求: curl "http://localhost:8080/pair"
返回: {"x": 0, "y": [3, "(3+2j)"]}