自V0.2.2后我们加入了插件管理,也定义了插件的开发路径plugins

在plugins下,放入完整的django 应用包

完整的插件app应用包目录树如下:

yourapp/
├── __init__.py
├── admin.py              # 管理员界面配置

├── plugin_meta.json    # 插件元信息文件
├── apps.py               # 插件应用配置
├── migrations/           # 数据库迁移文件
│   └── __init__.py
├── models.py             # 数据模型定义
├── static/               # 静态资源
│   ├── css/
│   │    └── yourapp.css # 自定义样式
│   ├── js/
│   │   ├── query.js      # 前端交互逻辑
│   │   └── map.js        # 地图展示逻辑
│    └── images/          # 图片资源
├── templates/            # 模板文件
│   ├── yourapp/
│   │   ├── detail.html   # 详情页面
├── templatetags/         # 自定义模板标签
│   ├── __init__.py
│    └── yourapp_tags.py      # 
├── tests/                # 测试用例
│   ├── __init__.py
│   ├── test_models.py
│   └── test_views.py
├── urls.py               # 路由配置
├── utils.py              # 工具类
└── views.py              # 视图逻辑

apps.py

这里我们要命名插件,以及路由注册,这一步非常重要。如果你是使用python manage.py startapp appname建立的app一定要注意name = 'plugins.yourapp'

from django.apps import AppConfig
from apps.core.services.route_service import register_app_urls


class YourAppConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'plugins.yourapp'
    verbose_name = "插件名称"

    def ready(self):
        # 自动注册路由
        register_app_urls(
            prefix="yourapp",  # URL前缀
            app_name=self.name,  # 应用命名空间
            priority=True)

urls.py

from django.urls import path
from .views import YourAppViews

app_name = 'yourapp'

urlpatterns = [
    path('', YourAppViews.as_view(), name='list'),

]

在包的根目录下须有plugin_meta.json

plugin_meta.json

{
    "name": "\u7528\u6237\u53cd\u9988\u63d2\u4ef6",
    "author": "\u7cfb\u7edf\u7ba1\u7406\u5458",
    "version": "1.0.0",
    "djacore_version": "4.2+",
    "description": "<p>\u6536\u96c6\u548c\u7ba1\u7406\u7528\u6237\u53cd\u9988\u7684\u63d2\u4ef6</p><ul><li>\u7528\u6237\u63d0\u4ea4\u53cd\u9988</li><li>\u67e5\u770b\u53cd\u9988\u5386\u53f2</li><li>\u7ba1\u7406\u5458\u5904\u7406\u53cd\u9988</li></ul>",
    "is_active": false,
    "dependency_status": "pending",  // 可能值: not_required/pending/installed
    "last_dependency_check": "2025-08-12T15:30:45.123456",
    "requires_db": true,
    "migration_status": "pending"
}

name:插件名称

author:作者

version:版本

diacore_version:Djacore版本

description:介绍,支持html,但要符合json规则,也就是说这里的代码要在一行。

is_active:控制插件是否启动,初始值为false。布尔值,true为启动,false为停用,新包就为false

dependency_status:这是用来说明插件依赖情况的。可能值:pending--需要并未安装/installed--已经安装过或不需要安装依赖。installed开发者不要使用,这是由程序操作的值

requires_db:这里用来说明是否需要数据库支持。布尔值,true为须数据库支持,false为不需要,根据实际情况设置

migration_status:这是用来记录插件数据库迁移情况的。可选值: "not_required"--不需要数据库支持, "pending"--未迁移, "completed"--已迁移。completed开发者不要使用,这是由程序操作的值

快速建立插件包

使用python manage.py create_plugin可以快速建立插件应用包

 

使用方法

1. 基本用法(文件夹模式,默认)

 
python manage.py create_plugin <插件名称>
 
 
示例:
 
python manage.py create_plugin user_feedback
 
 

2. 传统结构模式

 
python manage.py create_plugin <插件名称> --structure traditional
 
 
示例:
 
python manage.py create_plugin user_feedback --structure traditional
 
 

3. 完整参数

 
python manage.py create_plugin <插件名称> \
  --author "作者名" \
  --verbose-name "显示名称" \
  --structure [folder|traditional]
 
 
示例:
 
python manage.py create_plugin user_feedback \
  --author "张三" \
  --verbose-name "用户反馈系统" \
  --structure folder
 
 

4. 查看帮助

 
python manage.py create_plugin --help
 
 

目录树结构

文件夹模式(推荐)

结构特点:模块化组织,适合大型复杂插件
 
plugin_name/
├── __init__.py                      # 插件主文件
├── admin/                           # 管理员配置模块
│   ├── __init__.py
│   └── admin.py                     # 后台管理配置
├── api/                             # API模块
│   └── __init__.py
├── apps.py                          # 插件应用配置
├── dependencies.txt                 # 依赖声明文件
├── forms/                           # 表单模块
│   ├── __init__.py
│   └── forms.py                     # 表单定义
├── migrations/                      # 数据库迁移
│   └── __init__.py
├── models/                          # 数据模型模块
│   ├── __init__.py
│   └── models.py                    # 模型定义
├── plugin_meta.json                 # 插件元数据
├── README.md                        # 使用说明
├── requirements.txt                 # 依赖包列表
├── serializers/                     # 序列化器模块
│   └── __init__.py
├── signals.py                       # 信号处理器
├── static/                          # 静态资源
│   ├── css/
│   │   └── plugin_name.css          # 自定义样式
│   ├── images/
│   └── js/
│       ├── map.js                   # 地图展示逻辑
│       └── query.js                 # 前端交互逻辑
├── templates/                       # 模板文件
│   └── plugin_name/
│       ├── detail.html              # 详情页面
│       └── list.html                # 列表页面
├── templatetags/                    # 模板标签
│   ├── __init__.py
│   └── plugin_name_tags.py          # 自定义模板标签
├── tests/                           # 测试用例
│   ├── __init__.py
│   ├── test_api.py                  # API测试
│   ├── test_models.py               # 模型测试
│   └── test_views.py                # 视图测试
├── urls.py                          # 路由配置
├── utils.py                         # 工具类
└── views/                           # 视图模块
    ├── __init__.py
    └── views.py                     # 视图逻辑
 
 

传统模式

结构特点:标准Django应用结构,适合简单插件
 
plugin_name/
├── __init__.py                      # 插件主文件
├── admin.py                         # 后台管理配置
├── apps.py                          # 插件应用配置
├── dependencies.txt                 # 依赖声明文件
├── forms.py                         # 表单定义
├── migrations/                      # 数据库迁移
│   └── __init__.py
├── models.py                        # 模型定义
├── plugin_meta.json                 # 插件元数据
├── README.md                        # 使用说明
├── requirements.txt                 # 依赖包列表
├── signals.py                       # 信号处理器
├── static/                          # 静态资源
│   ├── css/
│   │   └── plugin_name.css          # 自定义样式
│   ├── images/
│   └── js/
│       ├── map.js                   # 地图展示逻辑
│       └── query.js                 # 前端交互逻辑
├── templates/                       # 模板文件
│   └── plugin_name/
│       ├── detail.html              # 详情页面
│       └── list.html                # 列表页面
├── templatetags/                    # 模板标签
│   ├── __init__.py
│   └── plugin_name_tags.py          # 自定义模板标签
├── tests/                           # 测试用例
│   ├── __init__.py
│   ├── test_api.py                  # API测试
│   ├── test_models.py               # 模型测试
│   └── test_views.py                # 视图测试
├── urls.py                          # 路由配置
├── utils.py                         # 工具类
└── views.py                         # 视图逻辑
 
 

依赖文件说明

dependencies.txt

 
# 插件依赖声明
# 每行一个依赖包,格式: 包名==版本号
# 示例:
# django-crispy-forms==1.14.0
# requests==2.28.1
#
# 这些依赖会在插件安装时自动检查并提示安装
#
# INSTALLED_APPS 依赖:
# 如果插件需要其他Django应用,请在此列出(每行一个):
# 示例:
# django.contrib.comments
# some_other_app
 
 

plugin_meta.json

 
{
  "name": "插件显示名称",
  "author": "作者",
  "version": "1.0.0",
  "djacore_version": "4.2+",
  "description": "<p>插件功能描述</p><ul><li>功能点1</li><li>功能点2</li></ul>",
  "is_active": false,
  "dependency_status": "pending",
  "last_dependency_check": "2026-01-01T00:00:00.000000",
  "requires_db": true,
  "migration_status": "pending"
}
 
 

两种模式对比

特性
文件夹模式
传统模式
适合场景
大型复杂插件
小型简单插件
模块组织
按功能模块分离
所有模块在根目录
文件数量
较多
较少
可维护性
扩展性
一般
与标准Django兼容性
需要特殊导入
完全兼容

插件开发后续步骤

创建插件后,需要执行以下步骤:
  1. 修改插件配置
     
    # 编辑插件元数据
    vi plugins/your_plugin/plugin_meta.json
    
    # 编辑依赖声明
    vi plugins/your_plugin/dependencies.txt
     
     
  2. 实现业务逻辑
     
    # 修改模型
    vi plugins/your_plugin/models/models.py
    
    # 修改视图
    vi plugins/your_plugin/views/views.py
    
    # 配置路由
    vi plugins/your_plugin/urls.py
     
     
  3. 启用插件
     
    # 在管理后台启用插件
     
     
  4. 运行数据库迁移
     
    python manage.py migrate your_plugin
     
     
  5. 安装依赖(如果需要)
     
    pip install -r plugins/your_plugin/requirements.txt
     
     

使用示例

示例1:创建文件夹结构的用户管理插件

 
python manage.py create_plugin user_management \
  --author "系统管理员" \
  --verbose-name "用户管理系统" \
  --structure folder
 
 

示例2:创建传统结构的日志插件

 
python manage.py create_plugin system_logs \
  --author "运维团队" \
  --verbose-name "系统日志监控" \
  --structure traditional
 
 

示例3:快速创建简单插件

 
python manage.py create_plugin quick_links
 
 

常见问题

Q1: 如何选择结构模式?

  • 如果插件功能复杂,需要多个模型、多个视图,选择文件夹模式
  • 如果插件功能简单,只有1-2个模型和视图,选择传统模式

Q2: 插件创建后需要手动添加什么?

  1. dependencies.txt中添加必要的依赖
  2. models.py中定义数据模型
  3. views.py中编写业务逻辑
  4. urls.py中配置路由
  5. 修改 plugin_meta.json中的描述信息

Q3: 插件如何与主系统交互?

  • 通过 dependencies.txt声明依赖
  • 通过 plugin_meta.json配置插件信息
  • 通过标准的Django应用方式集成
  • 通过主系统的路由服务自动注册
这个插件创建工具为您提供了两种结构选择,可以根据插件的复杂程度和个人偏好选择最适合的结构模式。

 

 

 

 

 

 

 

使用插件常见问题:

在安装插件依赖需要root权限,在debian12的宝塔9.5.0版本后发现终端需要root权限,所以在此版本后需要手动安装依赖

具体办法请参详《Debian系统安装插件依赖,显示成功实际上没有成功的原因》