Flask电机控制应用双按钮功能区分及停止按钮失效问题排查
问题根因
- 前端的stop按钮不在提交表单范围内,且按钮类型为普通button,点击时不会向后端发送POST请求,后端无法接收到停止指令
- 后端直接通过
request.form['key']的方式强制取参数,若请求未携带对应参数会直接抛出KeyError,导致请求中断 - 后端逻辑未区分submit和stop请求的执行顺序,即使stop请求能到达,也会先执行电机启动逻辑再执行停止逻辑,不符合预期
修复方案
1. 调整前端HTML代码
将stop按钮移入表单内部,修改按钮类型为submit,修改后表单部分代码如下:
<form method="post" action="/cooking_station/"> <table> <tr> <td class="special_td"> <table> <tr> <td> <p>Function:</p> </td> <td><select name="move" style="height:50px;"> <option value= "1" >Home swing</option> <option value= "5" >Relative</option> <option value= "5" SELECTED>★★★★</option> </select></td> </tr> <tr> <td> <p>Power level:</p> </td> <td> <input type="text" name="power_level" id="demoA" style="height:50px;" value={{power_level}}> </td> </tr> <tr> <td> <p>Velocity:</p> </td> <td> <input type="text" name="speed" id="demoB" style="height:50px;" value={{speed}}> </td> </tr> <tr> <td> <p>Timer:</p> </td> <td> <input type="text" name="timing" id="demoC" style="height:50px;" value={{timing}}></td> </tr> <tr> <td> <input type="submit" id="submit" name="submit" class="submit" value="Submit"> </td> <!-- 把stop按钮移到表单内,类型改为submit --> <td> <input type="submit" id="stop" name="stop" class="stop" value="Stop"> </td> <td><p3>{{message}}</p3></td> <td><p3>The angle is: {{message2}} grad</p3></td> </tr> </table> </td> </tr> </table> </form> <!-- 删掉原来在表单外的stop按钮代码 -->
2. 调整后端Python代码
修改参数取值方式,调整逻辑执行顺序,避免stop请求触发启动逻辑:
def testing(template_file, silo_type, name): global motor_id, object_controlword, object_statusword, angle, speed, move, distance, timing, power_level # 改用get方法取参数,设置默认值避免KeyError speed = request.form.get('speed', 0) move = request.form.get('move', 0) timing = request.form.get('timing', 0) power_level = request.form.get('power_level', 0) message = "" message2 = 0 # 空值转换 if speed == '': speed = 0 if move == '': move = 0 if timing == '': timing = 0 if power_level == '': power_level = 0 now = datetime.now() python_file = open(name + now.strftime("%d-%m-%y_%H:%M:%S") + ".txt", "x") if silo_type == 'cooking_station': CookingStation1 = CookingStation(int(51), int(3)) # 优先判断stop请求,避免执行启动逻辑 if request.form.get('stop'): print("stop test") CookingStation1.InductionGenerator.disable() # 可根据实际需求补充电机停止逻辑,比如 CookingStation1.Drive.stop() message = "The induction generator has stopped !" elif request.form.get("submit"): # 只有点击submit才执行启动逻辑 angle = int(speed) * int(timing) message2=angle print("Move: ", move) print("angle: ", message2) if int(move) == 1: CookingStation1.Drive.move_home() if int(move) == 5: CookingStation1.Drive.move_rel(int(angle), int(speed)) CookingStation1.InductionGenerator.setPower(int(power_level)) CookingStation1.InductionGenerator.enable(int(timing)) python_file.write("Execution date and time: " + now.strftime("%d/%m/%Y_%H:%M:%S") + ", Angle chosen: " + str(angle) + ", Speed chosen: " + str(speed) + ", Power value: " + str(power_level) + '\n') return render_template(template_file, angle=angle,speed=speed,move=move,timing=timing,power_level=power_level,message2=message2, message=message)
内容的提问来源于stack exchange,提问作者Camille Bouquet
相关产品推荐
相关产品推荐

