
InvenTree Slack 通知插件实战基于 NotificationMixin 的 Webhook 消息推送指南【免费下载链接】InvenTreeOpen Source Inventory Management System项目地址: https://gitcode.com/GitHub_Trending/in/InvenTreeInvenTree 内置的Slack Notification Plugin让库存管理系统的各类业务事件如库存变动、采购订单、销售订单等能够实时推送到指定 Slack 频道是团队协作场景下最直接的告警与状态同步方案。本文以该内置插件的官方文档为主体结合 InvenTree 源码讲解它的原理、webhook 配置方式、激活步骤以及自定义通知分发机制读完即可在自己的 InvenTree 实例中接入 Slack 通知。插件概览它解决什么问题Slack Notification Plugin 为 InvenTree 提供了一种将系统事件通知发送到 Slack 频道的机制。它实现了 NotificationMixin 混入类在仓库中的路径为 docs/docs/plugins/mixins/notification.md从而能够基于 InvenTree 系统中定义的各类事件发送通知。该插件的源码实现位于 src/backend/InvenTree/plugin/builtin/integration/core_notifications.py类名为InvenTreeSlackNotifications其关键元信息如下字段值NAMEInvenTreeSlackNotificationsTITLEInvenTree Slack NotificationsSLUGinventree-slack-notificationAUTHORInvenTree contributorsDESCRIPTIONIntegrated Slack notification methodsVERSION1.0.0从源码结构可以看出它同时继承了三个基类NotificationMixin提供通知发送的接口能力见 NotificationMixin.pySettingsMixin使插件拥有自己的配置项即 webhook URLInvenTreePlugin所有 InvenTree 插件的根基类。通知机制原理NotificationMixin 与事件分发在深入配置之前先理解该插件在通知体系中的位置。NotificationMixin是插件系统中专门用于向用户发送第三方通知的混入类其默认实现位于 src/backend/InvenTree/plugin/base/integration/NotificationMixin.py核心接口有两个send_notificationdef send_notification( self, target: Model, category: str, users: list, context: dict ) - bool: Send notification to the specified target users. # The default implementation does nothing return False参数含义源码 docstring 中明确给出target (Model)通知关联的目标模型实例例如某个库存项、某个订单category (str)通知的类别例如stock、sales_order等users (list)接收通知的用户列表context (dict)通知的上下文数据包含消息标题、消息正文、跳转链接等返回值bool是否发送成功。默认实现不做任何事并返回False具体的发送逻辑由每个插件如 Slack、Email、UI 通知插件各自重写。filter_targetsdef filter_targets(self, targets: list[User]) - list[User]: Filter notification targets based on the plugins logic. # Default implementation returns all targets return targets如果插件需要按特定条件过滤接收用户例如只通知某个角色的用户可以重写该方法默认实现原样返回所有目标用户。通知链路InvenTree 核心系统在发生事件时会创建NotificationEntry记录定义于 src/backend/InvenTree/common/models.py。NotificationEntry通过 GenericForeignKey 关联target_object并记录category等字段。所有实现了NotificationMixin的插件UI、Email、Slack都会被逐一调用send_notification把通知以各自的形式送达用户。Slack 插件只是这条通知分发链路上的一个投递员。配置 API Key / Webhook URL官方文档明确指出要使用该插件需要提供一个Slack API key用于向 Slack API 认证并发送消息到指定频道。在 InvenTree 当前源码实现中这项凭证实际对应的是一个Slack Incoming Webhook URL。从源码 core_notifications.py 可以看到插件的配置项定义SETTINGS { NOTIFICATION_SLACK_URL: { name: _(Slack incoming webhook URL), description: _(URL that is used to send messages to a slack channel), protected: True, } }关键细节配置键NOTIFICATION_SLACK_URL即用于向 Slack 频道发送消息的 incoming webhook URLprotected: True该配置项被标记为受保护。在 InvenTree 的设置体系中受保护配置项的值在 API 响应中会被隐藏显示为占位符只有具备相应权限的管理员才能查看或修改避免 webhook 凭证泄露在发送时插件通过self.get_setting(NOTIFICATION_SLACK_URL)读取该配置见 core_notifications.py。提示Slack 官方建议为每个频道创建一个独立的 Incoming Webhook这样不同业务通知可以路由到不同频道。激活插件该插件是可选optional插件默认不会启用必须手动开启。配置步骤如下登录 InvenTree 管理界面进入Settings → Plugins插件页面在已安装插件列表中找到InvenTree Slack NotificationsSLUGinventree-slack-notification启用Enable该插件此时插件处于激活状态在插件配置中填入NOTIFICATION_SLACK_URL即你创建的 Slack incoming webhook URL保存配置。需要说明的是该插件是 InvenTree 内置插件built-in plugin与第三方安装的插件不同内置插件随核心系统分发无法被卸载。这一点在插件的 API 测试中也有验证——src/backend/InvenTree/plugin/test_api.py 中针对inventree-slack-notification返回的卸载错误消息为Plugin cannot be uninstalled as it is a built-in plugin。激活后每当 InvenTree 生成一条通知事件插件就会尝试把消息推送到 webhook 指向的 Slack 频道。消息发送实现一次 Webhook 调用做了什么插件核心的发送逻辑在send_notification方法中core_notifications.py实现非常精简def send_notification( self, target: Model, category: str, users: list[User], context: dict ) - bool: Send the notifications out via slack. url self.get_setting(NOTIFICATION_SLACK_URL) if not url: return False ret requests.post( url, json{ text: str(context[message]), blocks: [ { type: section, text: {type: plain_text, text: str(context[name])}, }, { type: section, text: {type: mrkdwn, text: str(context[message])}, accessory: { type: button, text: { type: plain_text, text: str(_(Open link)), emoji: True, }, value: f{category}_{target.pk} if target else , url: context[link], action_id: button-action, }, }, ], }, ) return ret.ok这段代码透露了几个重要实现事实空 URL 短路若未配置 webhook URL方法直接返回False不发起任何请求避免无效调用与报错使用requests.post插件直接通过requests库向 webhook URL 发送 JSON 载荷返回值ret.ok表示 HTTP 状态是否成功该结果作为send_notification的返回值返回给通知分发框架消息结构Slack Block Kit载荷由两部分组成textSlack 通知预览文本用于非富客户端展示的兜底消息blocks一组 Block Kit 块包含一个section块以plain_text展示通知标题context[name]一个section块以mrkdwnMarkdown 语法渲染通知正文context[message]并附带一个按钮配件accessory按钮文本为Open link已本地化点击后跳转到context[link]指向的页面按钮value为f{category}_{target.pk}用于在 Slack 侧标识该通知对应的目标对象若target为空则为空字符串。借助 Block Kit 的交互按钮团队成员可以直接从 Slack 消息跳转回 InvenTree 中对应的订单、库存项或构建单页面实现通知即入口的闭环体验。订阅通知让用户接收 Slack 消息需要强调一点插件被激活并不等于所有用户自动收到所有通知。InvenTree 的通知体系遵循用户订阅 插件投递的组合机制用户需要在 InvenTree 中维护自己的通知订阅偏好选择希望接收哪些类别事件的通知如库存预警、订单状态变更等当事件发生时系统聚合出目标用户列表再依次调用已启用的通知插件进行投递若你希望做更细粒度的控制例如仅将 Slack 通知发给指定角色或特定用户可以参照 NotificationMixin 文档中关于filter_targets的说明自定义过滤逻辑。这与仓库中另外两个内置通知插件UI 通知 与 Email 通知共用同一套分发框架区别仅在于送达渠道不同。排障思路若 Slack 频道迟迟收不到消息可以按以下顺序排查确认插件已启用该插件为可选插件未启用则不会发送任何请求确认 webhook URL 已配置且正确NOTIFICATION_SLACK_URL若为空send_notification会直接返回Falsecore_notifications.py可在插件设置页复查确认事件确实生成了通知Slack 插件只是投递员事件本身必须触发了通知记录NotificationEntry才会有后续的插件分发动作确认目标用户已订阅该类别通知没有订阅用户users列表为空自然不会有投递行为检查 webhook 返回状态send_notification返回ret.ok即 Slack API 返回非 2xx 状态码时视为失败可通过服务端日志观察请求结果检查 Slack 侧 webhook 是否失效Incoming Webhook 若被删除或工作区策略变更会持续返回错误状态码。小结InvenTree Slack Notification Plugin 以 NotificationMixin 为接口基础通过一个受保护的 incoming webhook 配置项将系统事件以 Block Kit 富文本消息含标题、正文与跳转按钮推送到 Slack 频道。本文基于官方文档并结合 core_notifications.py 源码完整覆盖了从原理、配置、激活到排障的全流程。开发者也可以参考这一内置插件的实现模式基于相同的 Mixin 编写自定义的第三方通知插件如 Teams、DingTalk 等将 InvenTree 的通知能力扩展到任意消息渠道。【免费下载链接】InvenTreeOpen Source Inventory Management System项目地址: https://gitcode.com/GitHub_Trending/in/InvenTree创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考