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
Pait
的status
参数,代表现在的接口都在测试中,
但是在后面上线的时候所有接口的状态都需要一个个的改为release
,这是非常的麻烦,这时可以通过自己来实例化一个不同的Pait
,达到复用的目的。
使用自己定制的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_pait
的Pait
,
它的status
被指定为PaitStatus.test
,然后把global_pait
都应用到所有的接口函数中,这样的所有接口函数就等于前面应用的:
如果在后续的代码迭代且接口函数需要集中变动时,我们只需要直接修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_pait
的status
属性一样都是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_pait
与user_pait
的author
属性都是("so1n", )
,但是global_pait
的group
属性为global
,而user_pait
的group
属性为user
。
子Pait
创建之后就可以跟之前一样在接口函数使用了,比如下面的代码,用户登录接口函数user_login
以及用户注销函数user_logout
都使用user_pait
,
他们共同拥有group
为user
的属性;而获取服务器时间戳的接口函数get_server_timestamp
则单独使用的是global_pait
,它的group
为global
。
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_logout
的user_pait
装饰器填写对应的参数来达到更改的目的,
如下面的代码,其中高亮部分会把接口函数user_logout
的group
属性变为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_logout
的author
值变为("so1n", "Other Author")
。