插件核心

最小化的插件

# -*- coding: utf-8 -*-

__plugin_name__ = "Demo"
__author__ = "Mr.tao <staugur@saintic.com>"
__version__ = "0.1.1"

def register():
    return {}

然而,这个插件没有任何意义,它只是意味着一个有效的插件内容,无论是本地插件还是第三方插件,核心部分都是一样的。

上面最小化的插件,以 __ 双下划线开头和结尾,姑且称之为元数据,这用来定义插件的重要信息。

还有 register 函数用来返回扩展点。后面文档会一一讲解。

插件结构

一个插件至少需要拥有自己的目录,目录必须包含 __init__.py 文件,否则它不被认为是一个插件!

插件的核心代码可以写在插件目录下其他模块中,然后在 __init__.py 文件中使用 register 函数返回扩展点,此文件还包含注册所需的元数据。

__init__.py 中,你可以编写你的插件代码。当然,推荐的方法是在插件目录下创建其他的模块文件,在其中编写你的函数、类、变量等,然后在 __init__.py 中导入模块并使用 register 返回扩展点。

完整的插件化的Web应用程序的项目结构可能是像这样:

your_project/
├── app.py
├── config.py
├── libs
│   └── __init__.py
├── LICENSE
├── plugins
│   ├── __init__.py
│   └── local_plugin_demo    # A local plugin
│       ├── _core.py
│       ├── __init__.py
│       ├── license.txt
│       ├── readme.txt
│       ├── static
│       │   └── demo.css
│       ├── template
│       │   └── demo
│       │       └── demo.html
│       └── _util.py
├── README.md
├── requirements.txt
├── utils
│   └── __init__.py
└── views
    └── __init__.py

元数据

以下是所有支持的元数据配置项,请注意前三个是必需的:

  • __plugin_name__

    你的插件名称,不严格要求和插件目录名称保持一致。

  • __author__

    插件作者

  • __version__

    插件版本,符合 Semantic Version 2.0 规范。

  • __description__

    插件描述信息

  • __url__

    插件主页

  • __license__

    插件许可证

  • __license_file__

    插件许可证文件,位于你的插件目录下

  • __readme_file__

    插件自述文件,位于你的插件目录下

  • __state__

    插件状态,enabled (默认) 或 disabled。

register

这个函数也是必需的,应该在 __init__.py 被定义或导入。Flask-PluginKit将在加载插件时调用此函数,返回数据要求是dict,包含各种类型的扩展点,例如:

def register():
    return dict(
        bep=dict(),
        hep=dict(),
        tep=dict(),
        errhandler=dict(),
        filter=dict(),
        tcp=dict(),
    )

对于返回的扩展点,请参阅后续章节。

启用、禁用插件

此扩展使用不同的方法来处理插件。

无论如何,本地插件(位于应用程序中的子目录,例如plugins,是一个包)或第三方插件(可以是pypi或来自git,svn等等),都应该安装在本地环境中。

插件默认是启用的,有两种方法禁用或启用一个插件。

第一种方法是将元数据 __state__ 的值设置为 enabled (启用)或 disabled (禁用)。

第二种方法是在插件目录下添加一个 ENABLEDDISABLED 空文件。这个操作可以手动完成,也可以依靠Flask-PluginKit提供的方法 disable_plugin()enable_plugin()

备注

第二种方法比第一种优先级高,DISABLED文件比ENABLED文件优先级高。

禁用插件的目录结构如下所示:

my_plugin
|-- DISABLED    # Just add a empty file named "DISABLED"
|-- __init__.py

警告

需要重新启动或重新加载WSGI服务器以禁用插件,这是Flask的限制。不过,通过向Web应用程序服务器发送HUP信号,也可以重载应用。

以下代码片段展示了如何使用WSGI服务器gunicorn完成此操作。Gunicorn以守护进程(--daemon)启动,才能通过HUP信号重载应用。

您可以使用该命令手动重新加载:

$ kill -HUP Your_APP_Gunicorn_master_pid

或直接重启(杀死进程再启动)。

在Web应用程序中,根据以前的测试,它应该使用 os.getppid() 代替 os.getpid() 来获取gunicorn的master-pid,并向此pid发送SIGHUP信号。

为了安全,应该校验下进程名!

@app.route('/reload')
def reload():
    os.kill(os.getppid(), signal.SIGHUP)

此功能在v3.3.0中实现,参考文档 Web插件管理