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

