Skip to content

开发第一个插件#

创建插件目录与文件#

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',
)
  1. ArkID的内核代码都在arkid.core这个包中, extension(插件相关的各种基类), api(封装的ninja的api对象), event(事件有关的所有对象和方法)
  2. 事件tag
  3. 插件的package, 因为要反复使用,应该单独定义
  4. 定义插件,继承最基础的插件基类 Extension
  5. load() 抽象方法,所有插件的核心启动方法,必须实现
  6. 插件内注册事件,为了方式事件tag命名冲突,会在传入的tag前添加 package+'.' 为前缀
  7. 添加侦听事件的回调函数
  8. 定义回调函数
  9. 打印event的data参数
  10. 定义一个API,参考Django-ninja的相关文档
  11. 定义api的Schema,为了避免命名冲突,只能通过extension.create_extension_schema方法
  12. 抛出事件,注意事件的tag为添加前缀的部分
  13. 生成该插件的单例对象,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

提示

接口中的 tenant_id 可以在 租户管理-租户配置 中看到

评论