Flask-wtf Recaptcha 总是返回“响应参数丢失”

问题描述 投票:0回答:2

我正在尝试在 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。

python-3.x flask recaptcha flask-wtforms
2个回答
0
投票

我建议您查看this网页上的说明。 您可以使用它来代替

if form.validate_on_submit():

captcha_response = request.form['g-recaptcha-response']
if len(captcha_response) > 0:

0
投票

flask-wtforms文档指出:

为了您的方便,在测试您的应用程序时,如果 app.testing 是 确实,验证码字段始终有效。

因此,您需要在测试时设置

app.testing = True
,否则您必须使用从 reCAPTCHA 注册收到的相应公钥和私钥来设置 RECAPTCHA_PUBLIC_KEY 和 RECAPTCHA_PRIVATE_KEY 配置变量。

© www.soinside.com 2019 - 2024. All rights reserved.