【问题标题】:Including captcha in a django form以 django 形式包含验证码
【发布时间】:2019-02-26 15:26:41
【问题描述】:

我正在尝试将 Captcha 添加到我的 Django 表单中。我尝试了三个不同的库,但没有一个对我有用,我不知道我做错了什么。 这是我最后一次尝试:

我使用了this 库。 我的forms.py 看起来像这样:

class NewUserForm(UserCreationForm):
    email = forms.EmailField(required=True)
    captcha = NoReCaptchaField()

    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

这是urls.pypath("login/", views.login_request, name="login")

这是前端:login.html:<script src="https://www.google.com/recaptcha/api.js" async defer></script>

我更新了我的settings.py 文件,所以错误一定不存在。

【问题讨论】:

    标签: python django recaptcha


    【解决方案1】:

    您可以使用django-simple-captcha

    1. 安装它
    pip install  django-simple-captcha
    
    1. 在您的 settings.py 中将验证码添加到 INSTALLED_APPS
    2. 运行python manage.py migrate
    3. 在您的 urls.py 中添加一个条目:
    urlpatterns += [
           path(r'captcha/', include('captcha.urls')),
        ]
    

    在forms.py中:

    from django import forms
    from captcha.fields import CaptchaField
        
    class YourForm(forms.Form):
        captcha = CaptchaField()
    

    在模板中:

    <form action="/your-name/" method="post">
       {% csrf_token %}
       {{ form.captcha }}
       <input type="submit" value="Submit">
    </form>
    

    【讨论】:

    • 嘿!感谢您的回答。我想了解的是,我需要在我的 html 文件中添加什么?如何将表单重定向到我的登录或注册页面?
    • 只有一个问题:有没有办法用 path() 而不是 url() 添加我的 url 模式?
    • 我试过了,但还是不行。由于某种原因,我仍然看不到表格。我会接受您的回答并打开一个新问题来尝试解决它。谢谢!
    • @c.grey - 这对我有用。谢谢..你也知道如何在验证码旁边放一个刷新按钮吗?
    【解决方案2】:

    你也可以使用 mixin

    让您的视图继承自验证 recaptcha 的 mixin,c.greys 解决方案可能更容易,但您可能希望对模板之外的请求执行其他操作。

    import requests
    from django.http.response import HttpResponseForbidden
    from ipware import get_client_ip
    
    from .settings import RECAPTCHA_KEY, RECAPTCHA_SECRET
    
    
    class GoogleRecaptchaMixin:
        def post(self, request, *args, **kwargs):
            g_recaptcha_response = request.POST.get('g-recaptcha-response', None)
            client_ip, is_routable = get_client_ip(request)
            response = requests.post(
                "https://www.google.com/recaptcha/api/siteverify",
                data={
                    "secret": RECAPTCHA_SECRET,
                    "response": g_recaptcha_response,
                    "remoteip": client_ip
                }
            )
            response_dict = response.json()
            if response_dict.get("success", None):
                return super().post(request, *args, **kwargs)
            else:
                return HttpResponseForbidden(*args, **kwargs)
    

    在与上面代码相​​同的目录中,您将拥有一个包含您的密钥和秘密的设置文件,或者您可以直接从 django.conf 导入

    #settings.py
    from django.conf import settings
    
    
    RECAPTCHA_SECRET = getattr(settings, "RECAPTCHA_SECRET", '')
    RECAPTCHA_KEY = getattr(settings, "RECAPTCHA_KEY", '')
    

    在您的模板中,您将拥有如下内容:

    <form id="form-00" method="post" action="/process">{% csrf_token %}
      <button class="g-recaptcha"
              data-sitekey="your recaptcha key"
              data-callback="formSubmit">Recaptcha this</button>
    </form>
    <script type="text/javascript" src='https://www.google.com/recaptcha/api.js'></script>
    <script type="text/javascript">
            function formSubmit(token) {
                document.getElementById("form-00").submit();
            }
    </script>
    

    【讨论】:

    • 嘿!我得到一个“没有名为 main.settings 的模块”模块
    • 在示例中,我正在为模块导入本地 .settings 文件。只需使用您的 recaptcha 密钥和密码创建一个设置文件。我将在答案中添加一个示例。
    • 好的,我修好了。但是我遇到了与尝试使此验证码起作用的所有其他方式相同的问题。基本上我将表单添加到我的 html 文件中,但我不会看到任何表单。在这种情况下,我只能看到没有实际验证码表单的“Recaptcha this”按钮。我尝试过的所有其他图书馆都会发生这种情况,我仍然不知道为什么。
    • 查看有关表单渲染的文档或在您的 html 中手动创建表单,您可以打开一个新问题,但您可能会在这里找到您需要知道的所有内容docs.djangoproject.com/en/2.1/topics/forms
    猜你喜欢
    • 2019-07-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-31
    • 2017-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多