You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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页面。

修复步骤

  1. 修正表单提交目标
    修改HTML中的表单action属性,指向负责处理登录的login_info视图:

    <form method="post" action="{{ url_for('login_info')}}" novalidate>
    
  2. 清理根路由冗余代码
    根路由login里的form.validate_on_submit()调用和打印语句是多余的,修改后只负责显示登录页面:

    @app.route('/', methods=["GET", "POST"])
    def login():
        form = LoginForm()
        return render_template('login.html', form=form)
    
  3. 可选:简化路由结构(推荐)
    可以把登录验证逻辑合并到根路由,避免路由拆分带来的混淆,修改后的路由代码如下:

    @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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 07:34:55