自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": true,
"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. 基本用法(文件夹模式,默认)
2. 传统结构模式
3. 完整参数
4. 查看帮助
目录树结构
文件夹模式(推荐)
传统模式
依赖文件说明
dependencies.txt
plugin_meta.json
两种模式对比
特性 | 文件夹模式 | 传统模式 |
|---|---|---|
适合场景 | 大型复杂插件 | 小型简单插件 |
模块组织 | 按功能模块分离 | 所有模块在根目录 |
文件数量 | 较多 | 较少 |
可维护性 | 高 | 中 |
扩展性 | 好 | 一般 |
与标准Django兼容性 | 需要特殊导入 | 完全兼容 |
插件开发后续步骤
- 修改插件配置
- 实现业务逻辑
- 启用插件
- 运行数据库迁移
- 安装依赖(如果需要)
使用示例
示例1:创建文件夹结构的用户管理插件
示例2:创建传统结构的日志插件
示例3:快速创建简单插件
常见问题
Q1: 如何选择结构模式?
- 如果插件功能复杂,需要多个模型、多个视图,选择文件夹模式
- 如果插件功能简单,只有1-2个模型和视图,选择传统模式
Q2: 插件创建后需要手动添加什么?
- 在
dependencies.txt中添加必要的依赖 - 在
models.py中定义数据模型 - 在
views.py中编写业务逻辑 - 在
urls.py中配置路由 - 修改
plugin_meta.json中的描述信息
Q3: 插件如何与主系统交互?
- 通过
dependencies.txt声明依赖 - 通过
plugin_meta.json配置插件信息 - 通过标准的Django应用方式集成
- 通过主系统的路由服务自动注册
使用插件常见问题:
在安装插件依赖需要root权限,在debian12的宝塔9.5.0版本后发现终端需要root权限,所以在此版本后需要手动安装依赖
具体办法请参详《Debian系统安装插件依赖,显示成功实际上没有成功的原因》