Flask登录路由无法渲染Success/Denied.html模板求助
登录路由无法渲染Success/Denied模板的问题排查与修复
我正在进行100天编码项目,目前遇到了一个棘手的问题:登录功能无法正确渲染Success.html和Denied.html模板。我推测问题出在登录路由代码中,但暂时找不到具体原因,附上相关代码片段,希望能得到技术指导。
Python代码
import email_validator from flask import Flask, render_template, request from flask_wtf import FlaskForm from flask_wtf.csrf import CSRFProtect from wtforms.validators import Email, Length, DataRequired, ValidationError from wtforms import StringField, PasswordField, SubmitField from email_validator import validate_email # 创建Flask实例 app = Flask(__name__) # CSRF保护 app.secret_key = "123456" # 禁用CSRF保护(当前注释状态) # app.config['WTF_CSRF_ENABLED'] = False # 定义表单类 class LoginForm(FlaskForm): def validate_email(self, field): # 使用email_validator自定义邮箱验证 try: validate_email(field.data) except Exception as e: raise ValidationError(str(e)) email = StringField(label="Email", validators=[DataRequired(), Email()], render_kw={"size": 30}) password = PasswordField(label="Password", validators=[DataRequired(), Length(min=8)], render_kw={"size": 30}) submit = SubmitField(label="Log In") # 根路由 @app.route('/', methods=["GET", "POST"]) def login(): form = LoginForm() form.validate_on_submit() print(request.method) print(form.email.data) print(form.password.data) return render_template('login.html', form=form) # 登录处理路由 @app.route('/login', methods=["GET", "POST"]) def login_info(): form = LoginForm() if form.validate_on_submit(): if form.email.data == "admin@email.com" and form.password.data == "12345678": print(request.method) print(type(form.email.data)) print(type(form.password.data)) return render_template('success.html') else: return render_template('denied.html') else: return render_template('login.html', form=form) if __name__ == "__main__": app.run(debug=True)
登录页面HTML代码
<!DOCTYPE HTML> <html> <head> <title>Login</title> </head> <body> <div class="container"> <h1>Login Page</h1> <form method="post" action="{{ url_for('login')}}" novalidate> {{form.csrf_token}} <p> {{form.email.label}} <br> {{form.email}} {% for err in form.email.errors %} <span style="color:red">{{ err }}</span> {% endfor %} </p> <p> {{form.password.label}} <br> {{form.password}} {% for err in form.password.errors %} <span style="color:red">{{ err }}</span> {% endfor %} </p> {{form.submit}} </form> </div> </body> </html>
问题根源与修复方案
核心问题
表单提交的目标路由错了!HTML里表单的action指向了login视图(对应根路由/),但真正处理登录验证和页面跳转的逻辑在login_info视图(对应路由/login)。这就导致表单提交后,代码永远不会走到验证成功的分支,自然无法渲染Success或Denied页面。
修复步骤
修正表单提交目标
修改HTML中的表单action属性,指向负责处理登录的login_info视图:<form method="post" action="{{ url_for('login_info')}}" novalidate>清理根路由冗余代码
根路由login里的form.validate_on_submit()调用和打印语句是多余的,修改后只负责显示登录页面:@app.route('/', methods=["GET", "POST"]) def login(): form = LoginForm() return render_template('login.html', form=form)可选:简化路由结构(推荐)
可以把登录验证逻辑合并到根路由,避免路由拆分带来的混淆,修改后的路由代码如下:@app.route('/', methods=["GET", "POST"]) def login(): form = LoginForm() if form.validate_on_submit(): if form.email.data == "admin@email.com" and form.password.data == "12345678": return render_template('success.html') else: return render_template('denied.html') return render_template('login.html', form=form)这样HTML里的表单
action可以保持不变,甚至直接写成action="/",代码结构更清晰。
验证修复效果
修改完成后,重新启动Flask应用:
- 输入正确的邮箱
admin@email.com和密码12345678,应该会跳转到Success页面。 - 输入错误的凭据,会跳转到Denied页面。
- 表单验证错误(比如邮箱格式不正确、密码长度不足)会在登录页面显示错误提示。
内容的提问来源于stack exchange,提问作者PolymathCarlos
相关产品推荐
相关产品推荐

