How to use Pait decorator
In the process of using Pait,
may find that multiple route functions use the same parameter configuration, as shown in the following code:
from pait.app.any import pait
from pait.model.status import PaitStatus
@pait(status=PaitStatus.test)
def demo1() -> None:
pass
@pait(status=PaitStatus.test)
def demo2() -> None:
pass
@pait(status=PaitStatus.test)
def demo3() -> None:
pass
status is PaitStatus.test.
After a period of testing, the code has become complete and ready to be released,
the status of the route functions needs to be changed to Relese,
so each route function has to be manually changed to PaitStatus.test.
When there are a lot of route functions, manually switching the status of each of them can be very cumbersome.
For this reason, it is possible to define a common Pait and use it for all route functions,
so that these route functions can share the same Pait and thus the same configuration functionality.
Note
- 1.The examples provided in this section are based on the
Starletteframework, while other frameworks differ only in theimportstatement for importing thePaitclass. - 2.This section focuses on the usage of the
Paitclass. The role of different properties is described in the corresponding documentation. - 3.
Paitcan be thought of as a container for hosted data; as long as their properties are consistent, then their functionality is the same, even if there is no relationship between them.
1.Custom Pait
In the previous introduction to Pait, Pait is imported through the following syntax:
from pait.app.flask import pait
from pait.app.sanic import pait
from pait.app.starlette import pait
from pait.app.tornado import pait
Imported pait is a single instance of each Web framework corresponding to the Pait class,
in the customization of Pait, it is recommended to start through the Web framework corresponding to the Pait class,
such as the following sample code:
from pait.app.starlette import Pait
from pait.model.status import PaitStatus
from starlette.responses import Response
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
Pait class to create a Pait instance called global_pait,
it is similar to the framework corresponding pait instance,
the only difference is that its status attribute is specified as PaitStatus.test.
The other highlighted code applies global_pait to all route functions, and the status of the route function is the same as the status of the code below:
2.Create child Pait
A Pait can create its own child Pait through the create_sub_pait method,
and each child Pait's attributes are cloned from the parent Pait, as in the following code:
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()
other_pait is created by global_pait, so its status attribute is the same as global_pait.
If you don't want to clone the attributes of the parent Pait,
then you can override the attributes of the parent Pait by specifying the attributes of the child Pait when creating the child Pait,
as in the following code:
from pait.app.starlette import Pait
global_pait: Pait = Pait(author=("so1n",), group="global")
user_pait: Pait = global_pait.create_sub_pait(group="user")
The author attribute of both global_pait and user_pait is ("so1n", ).
However, since the value of group was specified as user when user_pait was created,
the group attributes of global_pait and user_pait are different, they are global and user.
3.Use of Pait
The usage of the sub Pait is identical to that of the standard pait decorator,
the only difference being that it already carries some of the configuration data on its own,
and after decorating the route function,
it will cause the route function to have the corresponding configuration functionality.
The following code:
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_login and user_logout are both decorated by user_pait, so the value of their group is user;
And the route function get_server_timestamp is decorated by global_pait, so the value of group is global.
In addition,
it is possible to overwrite the original attribute values of the child pait when the child pait decorates the route function.
As in the following code, the group attribute of user_logout of the route function in the highlighted code changes to user-logout and no longer to 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
In addition to overwriting the original value, some attributes also support appending values, as shown in the following code:
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"; author=("so1n", "Other Author",)
async def user_logout() -> JSONResponse:
pass
@global_pait() # group="global"
async def get_server_timestamp() -> JSONResponse:
pass
append_xxx family of Pait parameters to append the value so that the author value of user_logout becomes ("so1n", "Other Author").
Note
The appended value will only be added to the end of the sequence,
while some functions such as Pre-Depend need to consider the order in which the values are placed,
so please pay attention to whether the appending order is appropriate or not when use it.