Dev*_*012 2 python django recaptcha
我正在尝试将 Recaptcha 添加到 Django 的登录表单中。我尝试了不同的库,但似乎都不起作用,因为验证码表单没有出现在我的模板中。
这是我目前的工作:
urls.py
path(r'captcha/', include('captcha.urls'))
Run Code Online (Sandbox Code Playgroud)
表格.py
class NewUserForm(UserCreationForm):
email = forms.EmailField(required=True)
class YourForm(forms.Form):
captcha = CaptchaField()
class Meta:
model = User
fields = ("username", "email", "password1", "password2")
def save(self, commit=True):
user = super(NewUserForm, self).save(commit=False)
user.email = self.cleaned_data['email']
if commit:
user.save()
return user
Run Code Online (Sandbox Code Playgroud)
这是我的login.html模板
<form action="/your-name/" method="post">
{% csrf_token %}
{{ form.captcha }}
<input type="submit" value="Submit">
</form>
Run Code Online (Sandbox Code Playgroud)
在这种情况下,只会Submit出现按钮,而不会出现captcha表单。这就是我尝试过的任何其他库所发生的情况。有人可以给我一些帮助吗?提前致谢!
很难直接提供帮助,因为您没有提及您要使用的库。这是我向 Django 登录添加 v2 验证码的方法,不需要额外的库。
在此示例中,我将 recaptcha 脚本添加到 django 登录模板,并覆盖 django auth 应用程序的登录视图,以扩展其功能,以便验证 recaptcha 服务器端(根据google 文档使用适当的 RECAPTCHA_SECRET )。
另请注意,context_processor 用于在登录模板中插入 RECAPTCHA_SITE_KEY。
登录.html
...
<head>
<script src="https://www.google.com/recaptcha/api.js" async defer</script>
<script>
function onSubmit(token) {
document.getElementById("theForm").submit();
}
</script>
</head>
<body>
<form id="theForm">
<button class="g-recaptcha btn btn-primary"
data-callback="onSubmit"
data-sitekey="{{RECAPTCHA_SITE_KEY}}"
type="submit">Login
</button>
</form>
</body>
...
Run Code Online (Sandbox Code Playgroud)
网址.py
...
# overriding auth app endpoint
url(r'^accounts/login/', MyLoginView.as_view(), name='login'),
...
Run Code Online (Sandbox Code Playgroud)
上下文处理器.py
from django.conf import settings
def recaptcha_site_key(request):
return {'RECAPTCHA_SITE_KEY': settings.RECAPTCHA_SITE_KEY}
Run Code Online (Sandbox Code Playgroud)
设置.py
TEMPLATES = [
{
...
'OPTIONS': {
'context_processors': [
...
'yourapp.context_processors.recaptcha_site_key',
...
],
},
},
]
Run Code Online (Sandbox Code Playgroud)
我的登录视图.py
from django.contrib.auth import views as auth_views
def _validate_recaptcha(token, ip):
# implement server side validation according to google docs
pass
class MyLoginView(auth_views.LoginView):
'''Edited per @avib answer
'''
def post(self, form):
request_body = self.request.POST
if not request_body:
return None
recaptcha_token = request_body['g-recaptcha-response']
ip_addr, _ = get_client_ip(self.request)
if not _validate_recaptcha(recaptcha_token, ip_addr):
# your logic
return redirect('login')
return super().post(form)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4073 次 |
| 最近记录: |