跳转至

Pait的复用

在上面的章节中,介绍了通过直接使用Pait装饰器来使用参数转换与类型校验功能,也有简单的介绍通过pre_depend_list参数来使用Pait的Pre-Depend功能, 而在后面的章节中(如API文档)会介绍Pait的其它功能,这些功能用需要通过指定的参数来启用,不过很多接口本身都有一些共性导致它们在使用Pait时填写的参数的一样的, 比如当一个开发者编写了几个接口时,可能会这样写:

from starlette.responses import Response
from pait.app.starlette import pait
from pait.model.status import PaitStatus

@pait(status=PaitStatus.test)
async def demo() -> Response:
    pass


@pait(status=PaitStatus.test)
async def demo1() -> Response:
    pass

@pait(status=PaitStatus.test)
async def demo2() -> Response:
    pass
这个示例代码共有3个接口,但是它们都使用相同的Paitstatus参数,代表现在的接口都在测试中, 但是在后面上线的时候所有接口的状态都需要一个个的改为release,这是非常的麻烦,这时可以通过自己来实例化一个不同的Pait,达到复用的目的。

使用自己定制的Pait

在上面的使用中,我们都是通过:

from pait.app.starlette import pait
来引入一个Pait装饰器,这是一个最方便的使用方法,不过它本身是Web框架对应Pait类的单例,在考虑Pait的复用时,需要通过Web框架对应Pait类入手, 重新实例化一个自己定制的Pait,然后把接口的Pait替换为自己定义的Pait,比如下面的示例:
from starlette.responses import Response
from pait.app.starlette import Pait
from pait.model.status import PaitStatus


global_pait: Pait = Pait(status=PaitStatus.test)

@global_pait()
async def demo() -> Response:
    pass


@global_pait()
async def demo1() -> Response:
    pass


@global_pait()
async def demo2() -> Response:
    pass
代码中创建一个变量名为global_paitPait, 它的status被指定为PaitStatus.test,然后把global_pait都应用到所有的接口函数中,这样的所有接口函数就等于前面应用的:
@pait(status=PaitStatus.test)
async def demo() -> Response:
    pass
如果在后续的代码迭代且接口函数需要集中变动时,我们只需要直接修global_pait的属性则可以让所有接口的Pait属性都得到更改。

创建子Pait

Pait可以通过create_sub_pait方法创建自己的子Pait,每个子Pait的属性都是继承于自己的父Pait属性,比如下面这段示例代码:

from pait.app.starlette import Pait

from pait.model.status import PaitStatus

global_pait: Pait = Pait(status=PaitStatus.test)
other_pait: Pait = global_pait.create_sub_pait()
global_pait是一个父Pait,而other_pait则是被global_pait创建的,此时它的status属性也跟global_paitstatus属性一样都是PaitStatus.test。 但是也可以在创建的时候通过指定不同的值,使子Pait的属性被指定的值覆盖,比如这段代码:
from pait.app.starlette import Pait

global_pait: Pait = Pait(author=("so1n",), group="global")
user_pait: Pait = global_pait.create_sub_pait(group="user")
代码中global_paituser_paitauthor属性都是("so1n", ),但是global_paitgroup属性为global,而user_paitgroup属性为user

Pait创建之后就可以跟之前一样在接口函数使用了,比如下面的代码,用户登录接口函数user_login以及用户注销函数user_logout都使用user_pait, 他们共同拥有groupuser的属性;而获取服务器时间戳的接口函数get_server_timestamp则单独使用的是global_pait,它的groupglobal

from pait.app.starlette import Pait
from starlette.responses import JSONResponse

global_pait: Pait = Pait(author=("so1n",), group="global")
user_pait: Pait = global_pait.create_sub_pait(group="user")


@user_pait()  # group="user"
async def user_login() -> JSONResponse:
    pass

@user_pait()  # group="user"
async def user_logout() -> JSONResponse:
    pass

@global_pait()  # group="global"
async def get_server_timestamp() -> JSONResponse:
    pass
如果你突然想更改user_logout接口函数的Pait属性, 还可以在user_logoutuser_pait装饰器填写对应的参数来达到更改的目的, 如下面的代码,其中高亮部分会把接口函数user_logoutgroup属性变为user-logout而不是user:
from pait.app.starlette import Pait
from starlette.responses import JSONResponse

global_pait: Pait = Pait(author=("so1n",), group="global")
user_pait: Pait = global_pait.create_sub_pait(group="user")


@user_pait()
async def user_login() -> JSONResponse:
    pass

@user_pait(group="user-logout")
async def user_logout() -> JSONResponse:
    pass

@global_pait()
async def get_server_timestamp() -> JSONResponse:
    pass

除了覆盖原有的值外,部分属性还支持追加值,如下代码:

from pait.app.starlette import Pait
from starlette.responses import JSONResponse

global_pait: Pait = Pait(author=("so1n",), group="global")
user_pait: Pait = global_pait.create_sub_pait(group="user")


@user_pait()  # group="user"
async def user_login() -> JSONResponse:
    pass


@user_pait(append_author=("Other Author",))  # group="user"
async def user_logout() -> JSONResponse:
    pass


@global_pait()  # group="global"
async def get_server_timestamp() -> JSONResponse:
    pass
其中高亮部分使用到了append_xxx系列的参数来追加值,从而使user_logoutauthor值变为("so1n", "Other Author")

回到页面顶部