我正在尝试在 Flask Web 表单中实现 Recaptcha 2,但是,当我启用 recaptcha 时,我的表单总是无法验证。为了更深入地挖掘,我打印了 recaptcha 的错误,并且总是得到“响应参数丢失”。我查看了源代码,似乎这个错误对应于“缺少输入响应”,但是,我可以看到当我单击按钮时会出现绿色勾号。这是之前和之后的图片。
我已经在网上搜索了几个小时,但找不到发生这种情况的原因。这是我的烧瓶代码和我的 html。
烧瓶:
import os
from flask import Flask, render_template
from flask_wtf import FlaskForm
from flask_wtf.recaptcha import RecaptchaField
from wtforms import StringField, SubmitField
from flask_wtf.file import FileField, FileRequired, FileAllowed
from wtforms.validators import DataRequired
from dotenv import load_dotenv
app = Flask(__name__)
# load env variables
load_dotenv(dotenv_path='app.env')
SECRET_KEY = os.getenv('CSRF_TOKEN')
app.config['SECRET_KEY'] = SECRET_KEY
app.config['RECAPTCHA_PUBLIC_KEY'] = ''
app.config['RECAPTCHA_PRIVATE_KEY'] = ''
class InputForm(FlaskForm):
email = StringField('Email-Adresse', validators=[DataRequired()])
postcode = StringField('Postleitzahl', validators=[DataRequired()])
upload = FileField('Angebotsdatei', validators=[FileRequired(), FileAllowed(['png', 'jpg', 'pdf'], "Invalid file format")])
recaptcha = RecaptchaField()
submit = SubmitField('Starten')
@app.route('/', methods=['GET', 'POST'])
def index_2():
email = None
postcode = None
upload = None
form = InputForm()
# validate form
if form.validate_on_submit():
email = form.email.data
postcode = form.postcode.data
upload = form.upload.data
form.email.data = ''
form.postcode.data = ''
form.upload = ''
return render_template(
"index_2.html",
email = email,
postcode = postcode,
upload = upload,
form = form
)
if __name__ == "__main__":
app.run(debug=True, host='127.0.0.1', port=5000)
html:
{% extends 'base.html' %}
{% block content %}
<div class="container containerform pt-3">
<div class="container">
{% if email %}
<p class="text-center">Thanks for submitting to submitting the form!</p>
{% else %}
<form method="POST" enctype="multipart/form-data">
{{ form.hidden_tag() }}
{{ form.email.label(
class="form-label"
) }}
{{ form.email(
class="form-control"
) }}
{{ form.postcode.label(
class="form-label"
) }}
{{ form.postcode(
class="form-control"
) }}
{{ form.upload.label(
class="form-label"
) }}
{{ form.upload(
class="form-control"
) }}
</div>
<br>
<div class="recapture-box">
{% for error in form.recaptcha.errors %}
{{ error }}
{% endfor %}
{{ form.recaptcha }}
</div>
<br>
<div class="submit-button-form pb-4">
{{ form.submit(
class="btn btn-primary btn-form"
) }}
</div>
</form>
{% endif %}
</div>
{% endblock %}
如果有任何指点,我将不胜感激。
更新
我仍然没有设法解决问题,但是问题在于验证。虽然我可以单击并运行 recapcha,但我无法存储来自 google 的验证,因此我的validation_on_submit() 返回 False。
我建议您查看this网页上的说明。 您可以使用它来代替
if form.validate_on_submit():
。
captcha_response = request.form['g-recaptcha-response']
if len(captcha_response) > 0:
flask-wtforms文档指出:
为了您的方便,在测试您的应用程序时,如果 app.testing 是 确实,验证码字段始终有效。
因此,您需要在测试时设置
app.testing = True
,否则您必须使用从 reCAPTCHA 注册收到的相应公钥和私钥来设置 RECAPTCHA_PUBLIC_KEY 和 RECAPTCHA_PRIVATE_KEY 配置变量。