Django Simple Captcha
ボットによる不正アカウント作成の防止、スパム対策のための「CAPTCHA」。
Google reCAPTCHA は、クレジットカードの登録が必要なのと、100万件を超えると課金されるので、Google reCAPTCHA ではなく、django-simple-captcha を試しにインストールしてみました。
google reCAPTCHA を使用する場合は、こちらから (Django reCAPTCHA)。
Django Simple Captcha
インストール
pip install django-simple-captcha
次に、settings.py の INSATALED_APPS に 「‘captcha’,」 と記載します。
INSTALLED_APPS = [
(中略)
'axes',
'captcha',
]
前回記事でも書きましたが、「‘axes’,」の「,」を忘れると、以下のようなエラーが出ます。
ModuleNotFoundError: No module named 'axescaptcha'
で、「python manage.py check」で問題なければ、「python manage.py migrate」を実行します。
次に、urls.py に
urlpatterns += [
path('captcha/', include('captcha.urls')),
]
と記載します。
ちなみに、Pillow も必要なので、インストールしておきます。
django-axes との併用
django-axes と django simple captcha の併用には、幾つか設定が必要ですので、以下のドキュメントからコピー。
Integration with Django Simple Captcha
settings.py:
AXES_LOCKOUT_URL = '/locked'
example/urls.py:
url(r'^locked/$', locked_out, name='locked_out'),
example/forms.py:
class AxesCaptchaForm(forms.Form): captcha = CaptchaField()
example/views.py:
from axes.utils import reset_request from django.http.response import HttpResponseRedirect from django.shortcuts import render from django.urls import reverse_lazy from .forms import AxesCaptchaForm def locked_out(request): if request.POST: form = AxesCaptchaForm(request.POST) if form.is_valid(): reset_request(request) return HttpResponseRedirect(reverse_lazy('auth_login')) else: form = AxesCaptchaForm() return render(request, 'accounts/captcha.html', {'form': form})
example/templates/example/captcha.html:
<form action="" method="post"> {% csrf_token %} {{ form.captcha.errors }} {{ form.captcha }} <div class="form-actions"> <input type="submit" value="Submit" /> </div> </form>
試しに実装してみたものの、使用した印象としてはユーザビリティをかなり損なうので、もっと使いやすいものがあればそちらのほうが良いかもしれません。 今後の課題となりそうです。