Snippet workflow version deletion fails with 405 Method Not Allowed

该报错发生在 Dify 控制台的 Snippet(代码片段)版本历史管理中,当用户尝试删除已发布的工作流版本时,前端发送 DELETE 请求,但后端路由未实现 delete() 方法,导致返回 405 Method Not Allowed。优先排查后端 API 控制器是否缺少对应的 DELETE 方

快速结论:该报错发生在 Dify 控制台的 Snippet(代码片段)版本历史管理中,当用户尝试删除已发布的工作流版本时,前端发送 DELETE 请求,但后端路由未实现 delete() 方法,导致返回 405 Method Not Allowed。优先排查后端 API 控制器是否缺少对应的 DELETE 方法。

适用环境:Dify(Cloud 或当前 main 分支部署),涉及 Snippet 功能模块。

最快修复方案:暂无确认的一步修复方案。该问题需要后端代码修复:在 SnippetWorkflowByIdApi 类中补充 delete() 方法,并在 SnippetService 中新增对应的工作流删除逻辑。

注意事项:此修复方案来自 Issue 分析,尚未经过实际验证。需要小心处理草稿版本和当前已发布版本的保护逻辑,避免误删正在使用的工作流。

问题场景

在 Dify 控制台中,用户打开一个拥有至少一个已发布工作流版本的 Snippet,进入”版本历史”(Version History)面板,对历史版本执行”删除”操作并确认。前端会向 /console/api/snippets/{snippet_id}/workflows/{workflow_id} 发送 DELETE 请求,但后端返回 405 错误,导致版本删除失败。

报错原文

DELETE /console/api/snippets/{snippet_id}/workflows/{workflow_id}

Response 405:
{
  "code": "method_not_allowed",
  "message": "The method is not allowed for the requested URL.",
  "status": 405
}

原因分析

根本原因已经定位:后端路由 /snippets/<snippet_id>/workflows/<workflow_id> 对应的 SnippetWorkflowByIdApi 类只实现了 patch() 方法,没有实现 delete() 方法。前端版本历史面板暴露了删除操作并发送 DELETE 请求,但后端未处理该方法,因此返回 405。

这与 App 工作流的实现不一致——App 工作流的 WorkflowByIdApi 类实现了 delete() 方法,可调用 WorkflowService.delete_workflow() 完成删除。但 Snippet 的 owner 是 CustomizedSnippet 而非 App,因此不能直接复用现有的删除逻辑,需要单独实现。

环境排查

  • 确认 Dify 版本是否为当前 main 分支或 Cloud 开发部署(Issue 中确认的环境)
  • 检查后端文件 api/controllers/console/snippets/snippet_workflow.pySnippetWorkflowByIdApi 类是否仅包含 patch() 方法
  • 确认前端文件 web/app/components/snippets/components/workflow-panel.tsxdeleteVersionUrl 的配置
  • 验证 SnippetService 中是否存在 delete_workflow 方法(当前应不存在)

解决步骤

  1. api/services/snippet_service.py 中新增 delete_workflow 方法。参照现有 update_workflow() 的查询模式:按 snippet.idsnippet.tenant_id 过滤工作流,排除草稿版本,然后从会话中删除该工作流记录。
  2. api/controllers/console/snippets/snippet_workflow.pySnippetWorkflowByIdApi 类中新增 delete() 方法,使用与 patch() 相同的 RBAC 权限守卫,并调用第 1 步新增的服务方法。
  3. 注意保护逻辑:参照 WorkflowService.delete_workflow() 中的防护措施(约第 1912-1935 行),添加草稿版本删除保护;同时防止删除当前已发布的工作流版本(即 snippet.workflow_id 引用的版本)。App 使用中的检查可能不适用于 Snippet 场景,可酌情省略。
  4. 修复完成后,前端无需改动,版本历史面板的删除操作将正常工作。

验证方法

部署修复后的代码,重复问题复现步骤:打开 Snippet → 版本历史 → 对历史版本执行删除操作。确认请求不再返回 405 错误,版本列表刷新后不再显示被删除的版本。同时验证草稿版本和当前正在使用的版本无法被删除,确保防护逻辑生效。

参考来源

langgenius/dify #41000

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 19309

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注