Flask开发中如何识别同一表单内的不同提交按钮并执行对应逻辑
你当前的Home按钮逻辑写在表单校验的代码块内,只有登录表单校验通过才会触发判断,用户未填表单直接点Home时逻辑无法生效,调整方法如下:
方案1:最小改动修复现有逻辑
第一步:修改app.py中login路由逻辑
把Home按钮的判断提到表单校验逻辑之外:
from flask import request, redirect, url_for # 确保已导入对应依赖 @app.route('/login', methods=['GET', 'POST']) def login(): form = LoginForm() # 先判断是否点击了Home按钮 if request.method == "POST" and request.form.get('home') == 'Home': print("Home pressed") # 更推荐用redirect跳转首页路由,而非直接渲染模板,避免路径异常 # 如果你首页对应的路由函数名为index,就写url_for('index'),按需修改 return redirect(url_for('index')) # 如果确实要直接渲染index.html,再用下面这行 # return render_template('index.html') if form.validate_on_submit(): user = User.query.filter_by(username=form.username.data).first() if user: if check_password_hash(user.password, form.password.data): login_user(user, remember=form.remember.data) return redirect(url_for('dashboard')) return '<h1>Invalid username or password</h1>' return render_template('login.html', form=form)
第二步:login.html模板无需改动,原有Home按钮代码可以直接保留。
方案2:更简洁的优化方案(推荐)
Home按钮不需要提交登录表单,直接用超链接跳转即可,不用改后端逻辑,性能更好逻辑也更清晰:
修改login.html模板代码:
把原有Home按钮的input行替换为样式统一的超链接按钮:
{% block content %} <div class="container"> <form class="form-signin" method="POST" action="/login"> <h2 class="form-signin-heading">Please sign in</h2> {{ form.hidden_tag() }} {{ wtf.form_field(form.username) }} {{ wtf.form_field(form.password) }} {{ wtf.form_field(form.remember) }} <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button> <!-- 替换为超链接按钮,url_for自动拼接首页路由,按需修改路由函数名 --> <a href="{{ url_for('index') }}" class="btn btn-lg btn-default btn-block">Home</a> </form> </div> <!-- /container --> {% endblock %}
这个方案不需要修改app.py的代码,点击后直接跳转到首页,不需要走POST提交逻辑。
效果参考

内容的提问来源于stack exchange,提问作者user7531258
相关产品推荐
相关产品推荐

