插件基类#
插件最基础的基类为 arkid.core.extension.Extension
支持热拔插的核心方法为 start() 与 stop() 分别会调用load()与unload()方法,这两个方法是各个插件子类中,用来自定义安装与卸载时所做的操作
- load() 为抽象方法,要求每个插件都应实现。
- unload() 也可以被重载。会将所有load()过程中注册过的API,事件,等等进行销毁。
因此,在插件中尽量避免直接使用内核的API,而要使用插件中封装好的以 register 开头的方法。调用 register 类型的方法时,相关操作的销毁都会在stop中已经执行,不需要在unload中去做。
部分对页面内容的更改,比如actions相关修改,则需要在unload中显示的销毁。
提示
事实上,在调用start()前会进行 migrate,是的!插件内的 migrations 依然有效。
arkid.core.extension.Extension (ABC)
#
Parameters:
Name | Type | Description | Default |
---|---|---|---|
name |
str, |
插件名字,package中点“.”替换为下划线"_" |
None |
ext_dir
property
writable
#
插件完整路径,用.分隔
full_name
property
readonly
#
插件完整路径,用/分隔
model
property
readonly
#
插件对应数据库model
__init__(self, package=None, version=None, name=None, logo=None, description=None, labels=None, homepage=None, author=None)
special
#
summary
Parameters:
Name | Type | Description | Default |
---|---|---|---|
package |
str |
插件包名,唯一标识 |
None |
version |
str |
版本号 |
None |
name |
str |
名称 |
None |
logo |
str |
插件的图标 |
None |
description |
str |
描述 |
None |
labels |
List[str] |
标签 |
None |
homepage |
str |
主页,URL |
None |
author |
str |
作者 |
None |
create_composite_config_schema(schema_cls_name, exclude=[], **field_definitions)
classmethod
#
创造复合类型 运行时配置 的Schema
Parameters:
Name | Type | Description | Default |
---|---|---|---|
schema_cls_name |
str |
复合类型运行时配置的Schema的名字 |
required |
exclude |
list |
去掉的字段列表. Defaults to []. |
[] |
Returns:
Type | Description |
---|---|
Schema |
创建好的Schema |
create_config_schema(name, **field_definitions)
classmethod
#
创建并返回插件 运行时配置 的Schema
Parameters:
Name | Type | Description | Default |
---|---|---|---|
name |
str |
需要创建的 Schema Class 的名字 |
required |
field_definitions |
Any |
任意数量的field,格式为: field_name=(field_type, Field(...)) |
{} |
create_profile_schema(name, **field_definitions)
classmethod
#
创建并返回插件配置的Schema
Parameters:
Name | Type | Description | Default |
---|---|---|---|
name |
str |
需要创建的 Schema Class 的名字 |
required |
field_definitions |
Any |
任意数量的field,格式为: field_name=(field_type, Field(...)) |
{} |
create_settings_schema(name, **field_definitions)
classmethod
#
创建并返回插件 租户配置(settings) 的Schema
Parameters:
Name | Type | Description | Default |
---|---|---|---|
name |
str |
需要创建的 Schema Class 的名字 |
required |
field_definitions |
Any |
任意数量的field,格式为: field_name=(field_type, Field(...)) |
{} |
create_tenant_config(self, tenant, config, name, type)
#
创建运行时配置
Parameters:
Name | Type | Description | Default |
---|---|---|---|
tenant |
Tenant |
租户 |
required |
config |
dict |
config |
required |
name |
str |
运行时配置名字 |
required |
type |
str |
配置类型 |
required |
Returns:
Type | Description |
---|---|
TenantExtensionConfig |
创建的对象 |
delete_tenant_config(self, id)
#
删除运行时配置
Parameters:
Name | Type | Description | Default |
---|---|---|---|
id |
str |
config_id |
required |
Returns:
Type | Description |
---|---|
TenantExtensionConfig |
删除的对象 |
dispatch_event(self, event)
#
抛出事件
Parameters:
Name | Type | Description | Default |
---|---|---|---|
event |
Event |
事件实例 |
required |
Returns:
Type | Description |
---|---|
(tuple[Function, Result]) |
事件处理的返回值 |
error(self, enum=None, **kwargs)
#
API接口错误dict
Parameters:
Name | Type | Description | Default |
---|---|---|---|
enum |
Enum |
错误的枚举类,如果为None,标识成功返回. Defaults to None. |
None |
Returns:
Type | Description |
---|---|
dict |
生成的错误dict |
get_config_by_id(self, id)
#
通过config_id来获取config
Parameters:
Name | Type | Description | Default |
---|---|---|---|
id |
UUID |
config_id |
required |
Returns:
Type | Description |
---|---|
TenantExtensionConfig |
config |
get_settings(self, tenant)
#
获取租户配置
Parameters:
Name | Type | Description | Default |
---|---|---|---|
tenant |
Tenant |
租户 |
required |
Returns:
Type | Description |
---|---|
TenantExtension |
租户配置 |
get_tenant_configs(self, tenant)
#
获取当前租户下所有的运行时配置
Parameters:
Name | Type | Description | Default |
---|---|---|---|
tenant |
Tenant |
租户 |
required |
Returns:
Type | Description |
---|---|
List[TenantExtensionConfig] |
tenant下所有的运行时配置 |
listen_event(self, tag, func)
#
侦听事件
Parameters:
Name | Type | Description | Default |
---|---|---|---|
tag |
str |
事件的tag |
required |
func |
Function |
回调函数, event, **kwargs为必有参数。其中只有当前插件的package在event.packages中时,该插件才响应该事件。 |
required |
load(self)
#
抽象方法,插件加载的入口方法
register_api(self, path, method, view_func, *, tenant_path=False, auth=ninja.constants.NOT_SET_TYPE, response=ninja.constants.NOT_SET_TYPE, operation_id=None, summary=None, description=None, tags=None, deprecated=None, by_alias=False, exclude_unset=False, exclude_defaults=False, exclude_none=False, url_name=None, include_in_schema=True)
#
Django-ninja的方式注册自定义API
Parameters:
Name | Type | Description | Default |
---|---|---|---|
path |
str |
请求路径 |
required |
method |
str |
请求方法,值为:GET,POST,DELETE,PUT等 |
required |
view_func |
Callable |
api方法 |
required |
tenant_path |
bool |
是否需要tenant开头,为Ture时,path前自动加上'/tenant/{tenant_id}'的结构. Defaults to False. |
False |
auth |
Any |
认证方法. Defaults to NOT_SET. |
ninja.constants.NOT_SET_TYPE |
response |
Any |
response schema. Defaults to NOT_SET. |
ninja.constants.NOT_SET_TYPE |
operation_id |
Optional[str] |
Defaults to None. |
None |
summary |
Optional[str] |
Defaults to None. |
None |
description |
Optional[str] |
Defaults to None. |
None |
tags |
Optional[List[str]] |
Defaults to None. |
None |
deprecated |
Optional[bool] |
Defaults to None. |
None |
by_alias |
bool |
Defaults to False. |
False |
exclude_unset |
bool |
Defaults to False. |
False |
exclude_defaults |
bool |
Defaults to False. |
False |
exclude_none |
bool |
Defaults to False. |
False |
url_name |
Optional[str] |
Defaults to None. |
None |
include_in_schema |
bool |
Defaults to True. |
True |
Returns:
Type | Description |
---|---|
str |
真实的地址path |
register_composite_config_schema(self, schema, composite_value, exclude=[], package=None)
#
注册复合类型 运行时配置 的Schema
Parameters:
Name | Type | Description | Default |
---|---|---|---|
schema |
class |
Schema类 |
required |
composite_value |
str |
复合类型 |
required |
exclude |
list |
从schema的字段中删掉的字段列表. Defaults to []. |
[] |
package |
str |
自定义package名字,不传就使用self.package, 正常情况不用设置. |
None |
register_config_schema(self, schema, schema_tag=None)
#
注册插件的 运行时配置 config schema
Parameters:
Name | Type | Description | Default |
---|---|---|---|
schema |
class |
schema的类 |
required |
schema_tag |
str |
shema的标识, 默认为self.package |
None |
register_event(self, tag, name, data_schema=None, description='')
#
注册事件
Parameters:
Name | Type | Description | Default |
---|---|---|---|
tag |
str |
事件标识 |
required |
name |
str |
事件名字 |
required |
data_schema |
schema class |
event.data的schema. Defaults to None. |
None |
description |
str |
事件描述. Defaults to ''. |
'' |
Returns:
Type | Description |
---|---|
str |
真实事件标识tag,为self.package +'.'+ tag |
register_event_type(self, event_type)
#
注册事件类型
Parameters:
Name | Type | Description | Default |
---|---|---|---|
event_type |
EventType |
事件类型对象 |
required |
Returns:
Type | Description |
---|---|
EventType |
tag = package+'.'+tag |
register_extend_api(self, *api_schema_cls, **field_definitions)
#
注册扩展内核API
Parameters:
Name | Type | Description | Default |
---|---|---|---|
api_schema_cls |
class |
API Schema Class |
() |
field_definitions |
name=tuple(Type,Field |
需要增加的字段,example:name=(str, Field(title='名字')) |
{} |
register_extend_field(self, model_cls, model_field, alias=None)
#
注册扩展数据库字段,对原本数据库字段进行扩展
Parameters:
Name | Type | Description | Default |
---|---|---|---|
model_cls |
Union[ core_expand.TenantExpandAbstract, core_expand.UserExpandAbstract, core_expand.UserGroupExpandAbstract, core_expand.AppExpandAbstract, core_expand.AppGroupExpandAbstract, ] |
扩展定义的model |
required |
model_field |
str |
扩展的字段 |
required |
alias |
str |
扩展字段在原model中的别名. None意味着就使用model_field作为其在原model中的别名 |
None |
Exceptions:
Type | Description |
---|---|
Exception |
非法的扩展字段类对应的父类 |
register_front_pages(self, page)
#
注册前端页面
Parameters:
Name | Type | Description | Default |
---|---|---|---|
page |
core_pages.FrontPage |
前端页面 |
required |
register_front_routers(self, router, primary=None)
#
注册前端路由
Parameters:
Name | Type | Description | Default |
---|---|---|---|
router |
core_routers.FrontRouter |
前端路由实例 |
required |
primary |
core_routers.FrontRouter |
一级路由名字,由 core_routers 文件提供定义. Defaults to None. |
None |
register_profile_schema(self, schema, schema_tag=None)
#
注册插件配置 profile schema
Parameters:
Name | Type | Description | Default |
---|---|---|---|
schema |
class |
schema的类 |
required |
schema_tag |
str |
shema的标识, 默认为self.package |
None |
register_routers(self, urls_ext, tenant_urls=False)
#
注册路由
Parameters:
Name | Type | Description | Default |
---|---|---|---|
urls_ext |
List[partial] |
需要注册的路由 |
required |
tenant_urls |
bool |
是否要添加 tenant/{tenant_id}/ 前缀. Defaults to False. |
False |
register_settings_schema(self, schema, schema_tag=None)
#
注册插件的 租户配置 settings schema
Parameters:
Name | Type | Description | Default |
---|---|---|---|
schema |
class |
schema的类 |
required |
schema_tag |
str |
shema的标识, 默认为self.package |
None |
stop(self)
#
插件卸载
success(self, data=None, **kwargs)
#
API接口成功dict
Parameters:
Name | Type | Description | Default |
---|---|---|---|
data |
dict |
成功时需要返回的数据. Defaults to None. |
None |
Returns:
Type | Description |
---|---|
dict |
生成的成功dict |
unregister_extend_api(self, *api_schema_cls, *, field_keys=[])
#
移除扩展内核API
Parameters:
Name | Type | Description | Default |
---|---|---|---|
api_schema_cls |
class |
API Schema Class |
() |
field_keys |
list |
需要移除的字段名称,example:field_keys=['nickname','mobile']) |
[] |
update_or_create_settings(self, tenant, settings, is_active, use_platform_config)
#
更新或创建租户配置
Parameters:
Name | Type | Description | Default |
---|---|---|---|
tenant |
Tenant |
租户 |
required |
settings |
dict |
租户配置 |
required |
is_active |
bool |
是否启用 |
required |
use_platform_config |
bool |
是否使用平台配置 |
required |
Returns:
Type | Description |
---|---|
TenantExtension |
更新或创建的对象 |
update_tenant_config(self, id, config, name, type)
#
更新运行时配置
Parameters:
Name | Type | Description | Default |
---|---|---|---|
id |
str |
config_id |
required |
config |
dict |
config |
required |
name |
str |
运行时配置名字 |
required |
type |
str |
配置类型 |
required |
Returns:
Type | Description |
---|---|
bool |
更新成功True,没有找到该配置返回False |
arkid.core.extension.create_extension_schema(name, file_path, fields=None, base_schema=<class 'ninja.schema.Schema'>, exclude=[])
#
提供给插件用来创建Schema的方法
注意
插件必须使用此方法来定义Schema,避免与其它Schema的命名冲突
Parameters:
Name | Type | Description | Default |
---|---|---|---|
name |
str |
Schema的类名 |
required |
file_path |
str |
指插件__init__.py文件所在的路径, 用来通过插件的config.toml文件获取package,从而避免schema的命名冲突 |
required |
fields |
Optional[List[Tuple[str, Any, Any]]] |
Schema的字段定义 |
None |
base_schema |
Type[Schema] |
Schema的基类. 默认为: ninja.Schema |
<class 'ninja.schema.Schema'> |
Returns:
Type | Description |
---|---|
ninja.Schema |
创建的Schema类 |
arkid.core.extension.create_extension_schema_by_package(name, package='', fields=None, base_schema=<class 'ninja.schema.Schema'>, exclude=[])
#
提供给插件用来创建Schema的方法
注意
插件必须使用此方法来定义Schema,避免与其它Schema的命名冲突
Parameters:
Name | Type | Description | Default |
---|---|---|---|
name |
str |
Schema的类名 |
required |
package |
str |
如果是插件调用的该方法,一定要将插件的package传过来,以避免命名冲突 |
'' |
fields |
Optional[List[Tuple[str, Any, Any]]] |
Schema的字段定义 |
None |
base_schema |
Type[Schema] |
Schema的基类. 默认为: ninja.Schema |
<class 'ninja.schema.Schema'> |
Returns:
Type | Description |
---|---|
ninja.Schema |
创建的Schema类 |
arkid.core.extension.create_extension_schema_from_django_model(model, *, name='', depth=0, fields=None, exclude=None, custom_fields=None, base_class=<class 'ninja.schema.Schema'>)
#
提供给插件通过Django.Model创建Schema的方法
注意
插件必须使用此方法来定义Schema,避免与其它Schema的命名冲突
Parameters:
Name | Type | Description | Default |
---|---|---|---|
model |
Type[Model] |
基于的 Django Model |
required |
name |
str |
Schema的类名. |
'' |
depth |
int |
遍历Django Model的深度. |
0 |
fields |
Optional[List[str]] |
从Django Model中获取的字段名, 如果是所有的就设为 __all__ . |
None |
exclude |
Optional[List[str]] |
从Django Model中排除的字段名. |
None |
custom_fields |
Optional[List[Tuple[str, Any, Any]]] |
添加的自定义字段. |
None |
base_class |
Type[Schema] |
Schema的基类. |
<class 'ninja.schema.Schema'> |
Returns:
Type | Description |
---|---|
ninjia.Schema |
新创建的Schema类 |