Django - добавление Google recaptcha v2 в форму входа - PullRequest
0 голосов
/ 27 февраля 2019

Я пытаюсь добавить Recaptcha в мою форму входа в Django.Я пробовал разные библиотеки, но ни одна из них, похоже, не работает, так как форма капчи просто не отображается в моем шаблоне.

Вот моя текущая работа:

urls.py

path(r'captcha/', include('captcha.urls'))

forms.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

А вот и мой login.html шаблон

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

В этом случае появится только кнопка Submit, но не форма captcha.Это то, что случилось с любой другой библиотекой, которую я пробовал.Кто-нибудь может мне помочь?Заранее спасибо!

1 Ответ

0 голосов
/ 28 февраля 2019

Трудно помочь напрямую, так как вы не упомянули, какую библиотеку вы пытались использовать.Вот мой подход к добавлению recaptcha v2 к входу в Django, дополнительные библиотеки не требуются.

В этом примере я добавляю скрипт recaptcha в шаблон входа в django и переопределяю представление входа в приложение django auth, чтобырасширить его функциональность таким образом, чтобы он проверял серверную часть recaptcha (с соответствующим RECAPTCHA_SECRET согласно google docs ).

Также обратите внимание, что context_processor используется для вставки RECAPTCHA_SITE_KEY в шаблон входа в систему.

login.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>
...

url.py

...
# overriding auth app endpoint 
url(r'^accounts/login/', MyLoginView.as_view(), name='login'),
...

context_processor.py

from django.conf import settings 


def recaptcha_site_key(request):
    return {'RECAPTCHA_SITE_KEY': settings.RECAPTCHA_SITE_KEY}

settings.py

TEMPLATES = [
  {
    ...
    'OPTIONS': {
        'context_processors': [
            ...
            'yourapp.context_processors.recaptcha_site_key',
            ...
        ],
    },
  },
]

MyLoginView.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):
'''Use django login flow, with added logic for google recaptcha
'''
    def form_valid(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().form_valid(form)
...