Frappe框架操作按钮路由被自动添加/app前缀问题求助
解决Frappe操作按钮跳转路由自动添加/app前缀的问题
问题根源
Frappe前端路由机制默认会为内部应用路由自动拼接/app前缀,若直接用frappe.set_route("ABC")或按钮action配置跳转/ABC,框架会将其判定为内部路由并加上/app前缀。而hooks中配置的重定向是服务器端生效的,仅当浏览器向服务器发起页面请求时触发,前端单页应用内的路由切换不会触发该重定向,因此只有刷新页面时才会生效。
解决方法
方法1:修改操作按钮跳转逻辑,直接跳转到目标路由
若/ABC是独立路由(非Frappe内部应用页面),可在按钮点击事件中使用原生JS跳转,绕过Frappe内部路由处理:
- 若通过文档类型操作按钮配置设置
action:
function() { window.location.href = "/ABC"; }
- 若通过Python代码添加自定义按钮:
frappe.ui.form.on("自定义文档类型", { refresh: function(frm) { frm.add_custom_button("跳转至ABC", function() { window.location.href = "/ABC"; }); } });
方法2:配置Frappe路由规则,排除/ABC的/app前缀
若/ABC是Frappe自定义页面,可在hooks.py中配置website_route_rules,让框架直接识别/ABC而不添加前缀:
website_route_rules = [ {"from_route": "/ABC", "to_route": "path/to/your/page"}, ]
此处path/to/your/page替换为实际页面模板路径或页面名称,配置后操作按钮可直接使用frappe.set_route("ABC"),框架不会再自动添加/app前缀。
方法3:前端路由拦截修正(兼容内部路由场景)
若必须通过Frappe内部路由跳转,可在自定义JS文件中添加路由拦截逻辑,在路由切换时自动修正路径:
frappe.router.on("route_change", function(route) { if (route[0] === "app" && route[1] === "ABC") { window.location.href = "/ABC"; } });
该方法会在路由切换到/app/ABC时自动跳转到/ABC,无需刷新页面。
注意事项
- 确保
/ABC对应的页面已正确配置,服务器端可正常访问该路径。 - 开发模式下修改hooks或JS文件后,需重启Frappe服务并清空浏览器缓存,避免旧代码干扰。
内容的提问来源于stack exchange,提问作者Mehdi CHEBBAH
相关产品推荐
相关产品推荐

