You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django注册页面reCAPTCHA验证失败问题求助

解决Django注册页面reCAPTCHA验证失败问题

针对你遇到的reCAPTCHA验证失败问题,结合代码分析,以下是具体排查和修复方案:

1. 替换无效的Secret Key

你的verificar_recaptcha函数中硬编码了secret_key = 'secretkey',这是占位符,必须替换为Google reCAPTCHA控制台生成的实际Secret Key:

  • 登录Google reCAPTCHA控制台,确认你创建的是reCAPTCHA v2(复选框类型)还是v3版本
  • 复制对应版本的Secret Key,替换代码中的'secretkey'
  • 同时检查控制台中已添加的域名是否与你的测试域名一致(例如localhost:8000需要明确添加)

2. 补充Remote IP参数

Google reCAPTCHA验证要求提交用户的IP地址(remoteip参数),缺失该参数会导致部分场景验证失败。修改verificar_recaptcha函数:

import requests

def verificar_recaptcha(token, remote_ip):
    secret_key = '你的实际Secret Key'
    url = 'https://www.google.com/recaptcha/api/siteverify'
    payload = {
        'secret': secret_key,
        'response': token,
        'remoteip': remote_ip  # 添加用户IP参数
    }
    response = requests.post(url, data=payload)
    data = response.json()
    # 打印错误详情,方便排查问题
    if not data['success']:
        print("reCAPTCHA错误码:", data.get('error-codes'))
    return data['success']

在视图中调用时传入用户IP:

if verificar_recaptcha(request.POST.get('g-recaptcha-response'), request.META.get('REMOTE_ADDR')):

3. 检查模板中的reCAPTCHA字段

确认signup.html模板里的reCAPTCHA组件字段名是g-recaptcha-response,无拼写错误。以reCAPTCHA v2为例,正确嵌入代码应为:

<div class="g-recaptcha" data-sitekey="你的Site Key"></div>

注意Site Key需与控制台生成的一致,且和Secret Key配对。

4. 优化错误排查逻辑

当前代码仅返回成功/失败状态,无法定位具体错误原因。建议将Google返回的错误码传递到模板:
修改视图中的错误返回部分:

else:
    # 获取reCAPTCHA返回的错误码
    recaptcha_errors = data.get('error-codes', [])
    return render(request, 'signup.html', {
        'form': UserSignUpForm(),
        'error': 'Error de reCAPTCHA. Por favor, inténtalo de nuevo.',
        'recaptcha_error_details': recaptcha_errors
    })

在模板中临时打印错误详情(测试用,上线后可删除):

{% if recaptcha_error_details %}
    <p>错误详情: {{ recaptcha_error_details }}</p>
{% endif %}

常见错误码如invalid-input-secret(密钥无效)、invalid-input-response(用户提交的token无效)、missing-input-response(用户未完成验证),可根据这些信息快速定位问题。

5. 检查服务器网络连通性

确保Django服务器能访问https://www.google.com/recaptcha/api/siteverify,若为国内服务器,可能需要配置代理或使用合规的访问方式。

6. 规范表单集成(可选)

建议将reCAPTCHA验证集成到Django表单类中,更符合框架规范:

from django import forms

class UserSignUpForm(forms.Form):
    # 原有表单字段...
    recaptcha_response = forms.CharField(widget=forms.HiddenInput())

    def __init__(self, *args, **kwargs):
        self.remote_ip = kwargs.pop('remote_ip', None)
        super().__init__(*args, **kwargs)

    def clean_recaptcha_response(self):
        token = self.cleaned_data.get('recaptcha_response')
        if not verificar_recaptcha(token, self.remote_ip):
            raise forms.ValidationError('reCAPTCHA验证失败,请重试')
        return token

视图中初始化表单时传入用户IP:

form = UserSignUpForm(request.POST, remote_ip=request.META.get('REMOTE_ADDR'))

按上述步骤排查后,即可解决reCAPTCHA验证失败问题。

内容的提问来源于stack exchange,提问作者Triple D

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 08:13:13