我的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
这只有几分钟,但它应该能很好地解释基础知识,这样你就可以自己调试下一个问题了!