django-recaptcha不验证输入

时间:2014-02-06 07:29:54

标签: python django captcha django-recaptcha

我正在尝试将django-recaptcha与django-registration集成。我已经确定django-registration工作了。然后我根据其文档(django-recaptcha 0.0.6)安装和配置django-recaptcha。

我在captcha = ReCaptchaField()的{​​{1}}课程中添加了RegistrationForm,如下所示:

registration/forms.py

验证码确实显示,但是无论我在chptcha文本中输入什么(没有输入,正确或不正确),按下“Bottom”后,它总是显示“This field is需要。” (当然我输入了两个密码字段。)

captcha error

它不应该是私钥/公钥问题,因为验证码不会显示错误设置,而是错误文本。有什么想法吗?

BTW,我使用django 1.4.3的python 2.7。我测试了两个浏览器:chrome和IE9。

[增订]

我发现这个问题的根本原因是因为我输入的文本没有传递给POST请求,如下所示:

from captcha.fields import ReCaptchaField

class RegistrationForm(forms.Form):
    required_css_class = 'required'
    username = forms.RegexField(regex=r'^[\w.@+-]+$', max_length=30, label=_("Username"), error_messages={'invalid': _("This value may contain only letters, numbers and @/./+/-/_ characters.")})
    email = forms.EmailField(label=_("E-mail"))
    password1 = forms.CharField(widget=forms.PasswordInput, label=_("Password"))
    password2 = forms.CharField(widget=forms.PasswordInput, label=_("Password (again)"))

    captcha = ReCaptchaField()

    ...

客户端浏览器上显示的html源代码如下所示。通常它应该在POST请求中有“ recaptcha_challenge_field ”,但我不确定为什么客户端浏览器不会在POST请求中发送此变量。我是java脚本的新手。有什么想法吗?

POST:<QueryDict: {u'username': [u'test123'], u'password1': [u'123'], u'csrfmiddlewaretoken': [u'BUvEURhlUMYDx1DjztgdRuK1CrI7WanY'], u'email': [u'test@gmail.com'], u'password2': [u'123']}>,

1 个答案:

答案 0 :(得分:1)

我找到了答案!这是因为registration_form.html中的<table>标记是由django-registration包提供的标记。内容是:

{% extends "registration/registration_base.html" %}
{% load i18n %}
{% block title %}{% trans "Register for an account" %}{% endblock %}
{% block content %}
<table>
    <form method='post' action=''>{% csrf_token %}
        {{ form }}
        <tr><td></td><td><input type="submit" value="{% trans "Send activation email" %}" /></td>
    </form>
</table>
{% endblock %}

不幸的是,recaptcha在其java脚本中嵌入了另一个<table>标记,这意味着在registration_form <table>标记内会有recaptcha <table>标记。虽然浏览器可以正确呈现页面,但它无法正确检索嵌入式<table>

中的“recaptcha_challenge_field”和“recaptcha_response_field”等字段

解决方案是从registration_form.html中删除<table>相关标记。