开发第一个插件
创建插件目录与文件
clone下arkid的git仓库,在根目录下找到 arkid.toml 文件
找到 extension 项,该配置指示插件所存放的文件位置,如下:
[extension]
root = ["./extension_root", "./my_extensions"]
在 my_extensions 目录下新建文件夹,命名为:com_company_type_helloworld
注意
插件目录的文件名要与其package完全对应,仅仅将package的符号点 '.' 更换为下划线'_'
在文件夹 com_company_type_helloworld 下,新建文件__init__.py
这样插件的主体目录与主体文件建立完毕。
编写插件代码(逐行解析)
在 __init__.py 文件中插入以下代码:
| from arkid.core import extension,api,event # (1)
from pydantic import Field
HELLOWORLD = 'HELLOWORLD' # (2)
package = 'com.company.type.helloworld' # (3)
HelloworldOutSchema = extension.create_extension_schema( # (11)
'HelloworldOutSchema',
package,
fields = [
('data',str,Field())
]
)
class HelloworldExtension(extension.Extension): # (4)
def load(self): # (5)
super().load()
self.register_api( # (10)
'/helloworld_api/', 'GET', self.helloworld_api,
tags=['helloworld'], response=HelloworldOutSchema
)
hellowold_event_tag = self.register_event(HELLOWORLD, 'helloworld') # (6)
self.listen_event(hellowold_event_tag, self.helloworld) # (7)
def helloworld_api(self, request):
event_results = event.dispatch_event(event.Event(package+'.'+HELLOWORLD, tenant=None, data='helloworld')) # (12)
for fun, (result, ext) in event_results:
return {'data':result}
def helloworld(self, event, **kwargs): # (8)
print(event.data) # (9)
return event.data
extension = HelloworldExtension( # (13)
package=package,
description='my first extension',
version='1.0',
labels='hellowworld',
homepage='https://arkid.cc',
logo='',
author='your-name@your-company.com',
)
|
- ArkID的内核代码都在arkid.core这个包中, extension(插件相关的各种基类), api(封装的ninja的api对象), event(事件有关的所有对象和方法)
- 事件tag
- 插件的package, 因为要反复使用,应该单独定义
- 定义插件,继承最基础的插件基类 Extension
- load() 抽象方法,所有插件的核心启动方法,必须实现
- 插件内注册事件,为了方式事件tag命名冲突,会在传入的tag前添加 package+'.' 为前缀
- 添加侦听事件的回调函数
- 定义回调函数
- 打印event的data参数
- 定义一个API,参考Django-ninja的相关文档
- 定义api的Schema,为了避免命名冲突,只能通过extension.create_extension_schema方法
- 抛出事件,注意事件的tag为添加前缀的部分
- 生成该插件的单例对象,ArkID会获取__init__.py文件中的extension对象作为插件主体
载入与启动插件
启动Django
python manager.py runserver
ArkID会根据arkid.toml文件中的配置,自动在所有插件目录下依次加载所有插件,并打印出加载信息。
Importing my_extension/com_company_type_helloworld
xxxx-xx-xx 03:21:57,944 - arkid - INFO - Imported <module 'my_extension.com_company_type_helloworld' from '/arkid/my_extension/com_company_type_helloworld/__init__.py'>
xxxx-xx-xx 03:21:57,944 - arkid - INFO - my_extension.com_company_type_helloworld import success
加载成功后,如果插件是被启用的,则会调用其load()函数, 完成启动,启动成功会打印出如下内容:
2022-xx-xx 03:22:00,993 - arkid - INFO - my_extension.com_company_type_helloworld load success
检查与测试插件
访问:
http://{ArkID host}/api/redoc#tag/helloworld/operation/my_extension_com_company_type_helloworld_helloworld
可以看到在插件中定义的API会显示在文档中,
尝试调用该接口,可以获得打印:
helloworld
[xx/xx/xxxx 03:22:07] "GET /api/v1/tenant/{tenant_id}/helloworld/ HTTP/1.1" 200 4