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



我的pycharm ID运行窗口,

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在我的浏览器中显示登录表单。当我在表单中输入数据时,浏览器没有显示错误,但是无法重定向到主页。

在我的浏览器控制台中,我得到了这个错误,

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令牌。

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

这并不太复杂。

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

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

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

最新更新