快速开始

假设你已经安装了Flask-PluginKit,否则请转到 安装 部分。

第一种方法是直接初始化:

from flask_pluginkit import PluginManager, Flask
app = Flask(__name__)
pm = PluginManager(app)

第二种方式是使用工厂模式:

from flask_pluginkit import PluginManager, Flask
app = Flask(__name__)
pm = PluginManager()
pm.init_app(app)

插件结构

完成第一步后,您可以开始开发第一个插件。

插件是一个合法的python包,需要定义一些元数据并使用register来返回扩展点,更多请参阅 插件结构

例如,一个简单的插件结构看起来像这样:

my_plugin
|-- __init__.py

一个复杂的插件结构看起来像这样:

my_plugin
├── __init__.py
├── static
│   └── example
│       └── demo.css
└── templates
    └── example
        └── demo.html

Hello World

为了更好地理解你可以查看 example ,它包含一个本地插件和第三方插件。

现在,让我们开始制作一个简单的插件吧,名叫helloworld。

这个helloworld示例可以在这 here 找到。

首先,开发者编写了一个简单的插件Web应用程序,只有一个app.py文件,一个名叫index的视图函数,内容是:

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

from flask import Flask
from flask_pluginkit import PluginManager

app = Flask(__name__)
pm = PluginManager(app)

@app.route('/')
def index():
    return 'hello world'

现在,我们想限制访问index视图(即/),如果ip是127.0.0.1,则重定向到 /limit,步骤如下:

  1. 创建helloworld目录

$ mkdir -p plugins/helloworld
$ touch plugins/__init__.py plugins/helloworld/__init__.py
  1. 为helloworld插件编写 __init__.py,内容是:

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

from flask import Blueprint, jsonify, request, redirect, url_for, make_response

__plugin_name__ = "helloworld"
__version__ = "0.1.0"
__author__ = "staugur"

bp = Blueprint("helloworld", "helloworld")

@bp.route("/limit")
def limit():
    return jsonify(dict(status=0, message="Access Denial"))

def limit_handler():
    """I am running in before_request"""
    ip = request.headers.get('X-Real-Ip', request.remote_addr)
    if request.endpoint == "index" and ip == "127.0.0.1":
        resp = make_response(redirect(url_for("helloworld.limit")))
        resp.is_return = True
        return resp

def register():
    return {
        "bep": dict(blueprint=bp, prefix=None),
        "hep": dict(before_request=limit_handler)
    }
  1. 运行

当前web应用结构如下:

demo
├── app.py
└── plugins
    ├── helloworld
    │   └── __init__.py # Plugin core code file
    └── __init__.py     # Only an empty file

启动app:

$ FLASK_ENV=development FLASK_APP=app.py flask run --no-reload
  1. 测试

    _images/helloworld.png

更多细节,查阅 教程