我使用 python flask 创建了简单的登录表单,但我无法重定向到我的主页,

I create simple login form using python flask, but I cannot redirect to my Home page,

我的 pycharm ID 运行 window,

Restarting with stat
 * Debugger is active!
 * Debugger PIN: 127-177-535
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Detected change in 'C:\Users\ACER\PycharmProjects\wtf-forms\forms.py', reloading
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 127-177-535
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
127.0.0.1 - - [05/Feb/2021 21:57:38] "POST /login HTTP/1.1" 200 -
127.0.0.1 - - [05/Feb/2021 21:57:39] "POST /login HTTP/1.1" 200 -
127.0.0.1 - - [05/Feb/2021 21:57:39] "POST /login HTTP/1.1" 200 -

我在浏览器中输入 127.0.0.1/login 并显示登录表单。当我在我的表单中输入数据时,我的网络浏览器没有错误显示,但无法重定向到主页。

在我的浏览器控制台中出现此错误,

登录:1 未选中runtime.lastError:消息端口在收到响应之前关闭。

这是我的python代码,

from flask import Flask,redirect,render_template

from flask_wtf import FlaskForm

from wtforms import StringField,PasswordField,SubmitField

from wtforms.validators import DataRequired,Email,Length


class LoginForm(FlaskForm):
    email =StringField("Email",validators=[DataRequired(),Email()])
    password = PasswordField("Password",validators=[DataRequired(),Length(min=4,max=10)])

    submit =SubmitField("Log In")


app=Flask(__name__)
app.config["SECRET_KEY"]="secret"

@app.route("/")
def Home():
    return "Hello World"



@app.route("/login",methods=["POST","GET"])
def Index():
    form=LoginForm()

    if form.validate_on_submit():
       return redirect("Home")


    return render_template("index.html",form=form)





if __name__ =="__main__":
    app.run(debug=True)

这是我的HTML代码,

  <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>form</title>
    </head>
    <body>
    
    <form action="" method="POST">
        {{form.email.label()}}
        {{form.email()}}
        <br><br>
        {{form.password.label()}}
        {{form.password()}}
        <br><br>
        {{form.submit()}}
    
    </form>
    
    
    
    
    </body>
    </html>

** 请帮我解决这个错误。**

问题一

您尝试重定向到“Home”,这是一个函数名称,但没有路由。

您可以重定向到“/”或使用 Flask 的 url_for("Home")

问题二

您正在使用 Flask-WTF,一种表单框架,它会自动验证您提交的表单。

它还可以防止所谓的 CSRF 安全问题。

关于 CSRF 的更多信息

https://owasp.org/www-community/attacks/csrf

为了设置 CSRF 保护,您需要将以下代码添加到您的 Python 代码中:

from flask_wtf.csrf import CSRFProtect

...

csrf = CSRFProtect(app)

请确保在实例化 app 对象后放置带有 csrf 的行。

那么您需要更新您的 HTML 代码。

将此添加到您的表单中

    {{ form.csrf_token() }}

所以它看起来像...

<form action="" method="POST">
    {{ form.csrf_token() }}
    {{form.email.label()}}
    {{form.email()}}
    <br><br>
    {{form.password.label()}}
    {{form.password()}}
    <br><br>
    {{form.submit()}}

</form>

确保你已经根据这两个问题更新了你的代码,然后你的应用程序应该可以运行 - 它在我的电脑上运行。

如何解决这类问题?

我用调试器找到了问题。虽然我不时使用 Flask,但我没有看到你一次错过了 CSRF-token。

通常,然后我会启动调试器并单步执行代码。

这并不太复杂。

我在 Python 爱尔兰聚会上做了一个闪电演讲:

https://www.youtube.com/watch?v=Fxkco-gS4S8&t=1s&ab_channel=PythonIreland

这只有几分钟,但它应该很好地解释了基础知识,这样您就可以自己调试下一个问题了!