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