【问题标题】:RECAPTCHA_PUBLIC_KEY config not set with Flask-WTFormsRECAPTCHA_PUBLIC_KEY 配置未使用 Flask-WTForms 设置
【发布时间】:2015-06-27 22:02:11
【问题描述】:

当联系人页面尝试在 Flask 中使用带有 wtforms 的 Recaptcha 加载时,我已经翻遍了文档并不断收到“RuntimeError: RECAPTCHA_PUBLIC_KEY config not set”。我愿意接受任何建议。我正在使用 Google 的 ReCaptcha 2 FWIW 在 Ubuntu 14.04 上运行 Flask。

编辑:这个问题已经通过 dirn 的建议得到解决,但我现在收到一条 KeyError 消息,尽管正确输入了公钥和私钥。

这是我的堆栈跟踪。

File "/home/matt/work/bsureunion/venv/lib/python2.7/site-packages/flask/app.py", line 1836, in __call__return self.wsgi_app(environ, start_response)
File "/home/matt/work/bsureunion/venv/lib/python2.7/site-packages/flask/app.py", line 1820, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "/home/matt/work/bsureunion/venv/lib/python2.7/site-packages/flask/app.py", line 1403, in handle_exception
reraise(exc_type, exc_value, tb)
File "/home/matt/work/bsureunion/venv/lib/python2.7/site-packages/flask/app.py", line 1817, in wsgi_app
response = self.full_dispatch_request()
File "/home/matt/work/bsureunion/venv/lib/python2.7/site-packages/flask/app.py", line 1477, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/home/matt/work/bsureunion/venv/lib/python2.7/site-packages/flask/app.py", line 1381, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/home/matt/work/bsureunion/venv/lib/python2.7/site-packages/flask/app.py", line 1475, in full_dispatch_request
rv = self.dispatch_request()
File "/home/matt/work/bsureunion/venv/lib/python2.7/site-packages/flask/app.py", line 1461, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/home/matt/work/bsureunion/run.py", line 71, in contact
if form.validate_on_submit():
File "/home/matt/work/bsureunion/venv/lib/python2.7/site-packages/flask_wtf/form.py", line 166, in validate_on_submit
return self.is_submitted() and self.validate()
File "/home/matt/work/bsureunion/venv/lib/python2.7/site-packages/wtforms/form.py", line 310, in validate
return super(Form, self).validate(extra)
File "/home/matt/work/bsureunion/venv/lib/python2.7/site-packages/wtforms/form.py", line 152, in validate
if not field.validate(self, extra):
File "/home/matt/work/bsureunion/venv/lib/python2.7/site-packages/wtforms/fields/core.py", line 200, in validate
Display the sourcecode for this frameOpen an interactive python shell in this framestop_validation = self._run_validation_chain(form, chain)
File "/home/matt/work/bsureunion/venv/lib/python2.7/site-packages/wtforms/fields/core.py", line 220, in _run_validation_chain
validator(form, self)
File "/home/matt/work/bsureunion/venv/lib/python2.7/site-packages/flask_wtf/recaptcha/validators.py", line 47, in __call__
if not self._validate_recaptcha(response, remote_ip):
File "/home/matt/work/bsureunion/venv/lib/python2.7/site-packages/flask_wtf/recaptcha/validators.py", line 74, in _validate_recaptcha
for error in json_resp["error-codes"]:
KeyError: 'error-codes'

forms.py

from flask.ext.wtf import Form, RecaptchaField
from wtforms import StringField, TextAreaField, SubmitField
from wtforms.validators import InputRequired, Email
from wtforms.fields.html5 import EmailField

class ContactForm(Form):
name = StringField("Name", validators=[InputRequired('Please enter your name.')])
email = EmailField("Email",  validators=[InputRequired("Please enter your email address."), Email("Please enter your email address.")])
subject = StringField("Subject", validators=[InputRequired("Please enter the subject.")])
message = TextAreaField("Message", validators=[InputRequired("Please enter your message.")])
recaptcha = RecaptchaField()
submit = SubmitField("Send")

运行.py

import os
from flask import Flask, render_template, request, flash
from forms import ContactForm
from flask.ext.mail import Message, Mail

mail = Mail()

app = Flask(__name__)

app.secret_key = 'secret_'

app.config["MAIL_SERVER"] = "smtp.gmail.com"
app.config["MAIL_PORT"] = 465
app.config["MAIL_USE_SSL"] = True
app.config["MAIL_USERNAME"] = 'me@gmail.com'
app.config["MAIL_PASSWORD"] = 'password'

SECURITY_EMAIL_SENDER = 'me@gmail.com'

RECAPTCHA_USE_SSL = False
RECAPTCHA_PUBLIC_KEY = 'public'
RECAPTCHA_PRIVATE_KEY = 'private'
RECAPTCHA_OPTIONS = {'theme': 'white'}

mail.init_app(app)

****snip****

@app.route('/contact/', methods=['GET', 'POST'])
def contact():
form = ContactForm()

if request.method == 'POST':
    if form.validate() == False:
      flash('All fields are required.')
      return render_template('contact.html', form=form)
if form.validate_on_submit():
    msg = Message(form.subject.data, sender='contact@bsureunion.com', recipients=['me@gmail.com'])
    msg.body = """
    From: %s <%s>
    %s
    """ % (form.name.data, form.email.data, form.message.data)
    mail.send(msg)

    return render_template('contact.html', success=True)

elif request.method == 'GET':
  return render_template('contact.html', form=form)

contact.html

{% extends "layout.html" %}

{% block body %}
<h2>Contact</h2>

{% if success %}
  <p>Thank you for your message. We'll get back to you shortly.</p>
  <p>Return to <a href="{{ url_for('home') }}">Home Page</a>.</p>

{% else %}

  {% for message in form.name.errors %}
    <div class="flash">{{ message }}</div>
  {% endfor %}

  {% for message in form.email.errors %}
    <div class="flash">{{ message }}</div>
  {% endfor %}

  {% for message in form.subject.errors %}
    <div class="flash">{{ message }}</div>
  {% endfor %}

  {% for message in form.message.errors %}
    <div class="flash">{{ message }}</div>
  {% endfor %}

  <form action="{{ url_for('contact') }}" method=post>
    {{ form.hidden_tag() }}

    {{ form.name.label }}
    {{ form.name }}

    {{ form.email.label }}
    {{ form.email }}

    {{ form.subject.label }}
    {{ form.subject }}

    {{ form.message.label }}
    {{ form.message }}

    {{ form.recaptcha }}

    {{ form.submit }}
  </form>

{% endif %}
{% endblock %}

【问题讨论】:

    标签: python flask recaptcha wtforms flask-wtforms


    【解决方案1】:

    您没有将配置设置添加到应用程序。您正在定义模块级变量

    RECAPTCHA_USE_SSL = False
    RECAPTCHA_PUBLIC_KEY = 'public'
    RECAPTCHA_PRIVATE_KEY = 'private'
    RECAPTCHA_OPTIONS = {'theme': 'white'}
    

    您需要使用名称作为配置字典的键。

    app.config['RECAPTCHA_USE_SSL'] = False
    app.config['RECAPTCHA_PUBLIC_KEY'] = 'public'
    app.config['RECAPTCHA_PRIVATE_KEY'] = 'private'
    app.config['RECAPTCHA_OPTIONS'] = {'theme': 'white'}
    

    【讨论】:

    • 非常感谢!这解决了问题,但我现在试图在解决验证码后找出后续的 KeyError 消息。我已经三次检查了公钥和私钥。
    • 如果KeyError 与 Recaptcha 相关,请更新您的问题。如果不是,请提出一个新问题。
    • @dirn 我遇到了与问题相同的问题,您的建议提供了一些指导。但是,我无法重现您的解决方案。我没有手动创建表单,而是使用flask-bootstrap 的wtf.quick_form(form)。 reCaptcha 添加到表单中,相关脚本添加到基本模板中。知道为什么错误仍然存​​在吗?
    • 能够通过严格命名我的配置变量 RECAPTCHA_PUBLIC_KEY 而不是 reCAPTCHA_SITE_KEY 来修复错误。这就是我最初命名它的方式。
    猜你喜欢
    • 2019-02-21
    • 1970-01-01
    • 1970-01-01
    • 2022-07-14
    • 1970-01-01
    • 2022-12-04
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多