插件核心¶
最小化的插件¶
# -*- 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 (禁用)。
第二种方法是在插件目录下添加一个 ENABLED
或 DISABLED
空文件。这个操作可以手动完成,也可以依靠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插件管理