在 wtforms 中打印 form.validate_on_submit() 时我得到 False 并且我也设置了密钥
Posted
技术标签:
【中文标题】在 wtforms 中打印 form.validate_on_submit() 时我得到 False 并且我也设置了密钥【英文标题】:I am getting False when print form.validate_on_submit() in wtforms and i set secret key also 【发布时间】:2022-01-22 21:36:31 【问题描述】:当我在 login.html 中输入电子邮件并单击提交时,我无法打印他们输入的内容,我得到 form.validate_on_submit = False 请帮我解决我的问题。
这是我的 main.py 文件
from flask import Flask, render_template, request
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired
app = Flask(__name__)
app.config['SECRET_KEY'] = "hi this key is secret"
class LoginForm(FlaskForm):
email = StringField(label="Email", validators=[DataRequired()])
submit = SubmitField(label="Submit")
@app.route("/")
def home():
return render_template('index.html')
@app.route("/login", methods=["GET", "POST"])
def login():
form = LoginForm(app.secret_key)
email = None
print(form.validate_on_submit())
if form.validate_on_submit():
print(form.validate_on_submit())
email = form.email.data
form.email.data = ""
else:
print("form not submitted")
return render_template("login.html", form=form, email=email)
if __name__ == '__main__':
app.run(debug=True)
Jinja 模板 (index.html)
<!DOCTYPE HTML>
<html>
<head>
<title>Login</title>
</head>
<body>
<div class="container">
% if email %
<h1>Your Email Is</h1>
<h3> email </h3>
% else %
<h1>Login</h1>
<form method="post" action=" url_for("login") ">
form.hidden_tag()
form.email.label form.email(size=20)
form.submit()
</form>
% endif %
</div>
</body>
</html>
提前致谢
【问题讨论】:
您看不到已输入的内容,因为目前您不打印它。在您的代码中添加这一行:print(form.email.data)
当我在 if validate_on_submit 之后添加它时,它不会打印,因为 validate_on_submit 是 False,如果我在 if 语句之前添加它,那么表格还没有填写,这就是问题@Tobin
我在您的代码中看到的另一个问题是您有 2 个模板 index.html
和 login.html
。您使用模板login.html
呈现表单,但管理表单的所有逻辑都在模板index.html
中。您应该将此代码移动到 login.html
文件中,以便 Flask 验证您的表单。
在login
函数中,您只是提供密钥,而不是用户输入的数据。所以,尝试使用form = LoginForm(request.form)
。并且不需要使用form.email.data = ""
。
是的,它有效@KalyanThankyou
【参考方案1】:
我找对了方法 main.py 文件
from flask import Flask, render_template, request
from flask_wtf import FlaskForm
from flask_wtf.csrf import CsrfProtect
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired
app = Flask(__name__)
app.config['SECRET_KEY'] = "hi this key is secret"
csrf = CsrfProtect(app)
class LoginForm(FlaskForm):
email = StringField(label="Email", validators=[DataRequired()])
password = PasswordField(label="Password", validators=[DataRequired()])
submit = SubmitField(label="Submit")
@app.route("/")
def home():
return render_template('index.html')
@app.route("/login", methods=["GET", "POST"])
def login():
form = LoginForm(formdata=request.form)
if form.validate_on_submit():
email = form.email.data
password = form.password.data
return render_template("login.html", form=form)
if __name__ == '__main__':
app.run(debug=True)
神社模板
<!DOCTYPE HTML>
<html>
<head>
<title>Login</title>
</head>
<body>
<div class="container">
<h1>Login</h1>
<form method="post" action=" url_for('login') " novalidate>
form.csrf_token
<p>
form.email.label <br> form.email(size=20)
% for err in form.email.errors %
<span style="color: red"> err </span>
% endfor %
</p>
<p>
form.password.label <br> form.password(size=20)
% for err in form.password.errors %
<span style="color: red"> err </span>
% endfor %
</p>
form.submit()
</form>
</div>
</body>
</html>
这个对我有用,希望对每个人都有用
【讨论】:
以上是关于在 wtforms 中打印 form.validate_on_submit() 时我得到 False 并且我也设置了密钥的主要内容,如果未能解决你的问题,请参考以下文章