继承Tornado项目中post执行后点击跳转为何触发get方法而非跳转?
解决你的Tornado重定向异常问题
兄弟,刚接手Tornado项目就碰到这种前后端交互的坑确实闹心,我帮你一步步拆解问题根源和解决办法:
1. 先理清Post请求后的服务器端逻辑
你提到调用classname.post后Python触发重定向,先确认你的post方法是不是用了Tornado内置的self.redirect()?这是服务器端重定向,浏览器收到3xx状态码后会自动发GET请求到目标页面——这部分是Tornado的正常行为,但问题出在后续的前端按钮交互上。
2. 排查OK按钮的前端逻辑(最可能的坑)
点击OK没触发JS重定向反而调用classname.get(),90%是前端按钮的默认行为没处理好,常见场景有这几个:
- 按钮是submit类型且在form中:如果你的OK按钮是
<button type="submit">或者嵌套在<form>标签里,点击它会自动提交表单,而表单默认用GET方法提交到当前路由,直接触发classname.get(),完全跳过你的JS重定向。
解决办法很简单:要么阻止默认行为,要么改按钮类型:// 方法1:阻止默认提交行为 document.querySelector('#ok-btn').addEventListener('click', function(e) { e.preventDefault(); // 关键:阻止表单默认提交 window.location.href = '/your-target-page'; // 你的重定向逻辑 }); // 方法2:修改按钮类型 <button type="button" id="ok-btn">OK</button> - JS代码执行出错:打开浏览器F12的Console面板,看看有没有报错。如果JS代码在重定向前就抛出错误,那逻辑会中断,按钮的默认行为就会触发。
- 重定向路径错误:如果JS里的路径写错了(比如相对路径不对),页面可能没跳转,用户误以为没执行,而留在原页面后如果触发刷新,就会调用
classname.get()。
3. 核对Tornado路由与Handler配置
检查你的Application类里的handlers配置,是不是classname对应的路由同时绑定了GET和POST:
handlers = [ (r'/your-route-path', classname), ]
Tornado中,只要Handler类实现了get()和post(),这个路由就会同时响应两种请求。如果前端意外发起了GET请求到这个路由,自然会触发classname.get()。
4. 调试小技巧
- 用浏览器Network面板(F12→Network)看点击OK时的请求:是发起了GET请求到
classname的路由,还是根本没触发重定向?这能快速定位是JS没执行,还是默认行为抢了先。 - 在
classname.get()里加日志,比如self.log.info("GET method triggered from OK button"),确认触发时机和来源。
内容的提问来源于stack exchange,提问作者RightmireM
相关产品推荐
相关产品推荐

