スポンサーリンク

コードが書ける!数式が書ける!AAが書ける!スタンプが貼れる!

無料の匿名掲示板型SNS「このはちゃんねる

新規会員募集中!

【Django】フォームに画像認証の reCAPTHA を導入する【迷惑メール対策】

55, 2019-07-20

目次

はじめに

サイトに取り付けたメールフォームの迷惑メール対策にGoogleの「reCAPTCHA」を導入したかったので方法を調べました。

環境

  • Python 3.4.3
  • Django 1.11

APIの取得

reCAPTCHA: Easy on Humans, Hard on Bots にアクセスし「Get reCAPTCHA」に進み、「reCAPTCHA V2」を選択して登録する。ドメインに「localhost」か「127.0.0.1」を登録すると開発環境でテストが出来る。
登録すると「サイトキー」と「シークレットキー」を手に入れることが出来るのでメモをする。

Form

フォーム。特に必要処理無し。

from django import forms                                                                            

class EmailForm(forms.Form):

    email = forms.EmailField()

Views

ビュー。reCAPTCHAによる認証をしている。secretにシークレットキーを渡す。

from django.shortcuts import render
from django.http import HttpResponse                                                                
from .forms import EmailForm

def index(req):
    if req.method == 'GET':
        return render(req, 'mysite/index.html', {
            'email_form': EmailForm(),
        })
    elif req.method == 'POST':
        res = recaptha(req)
        if res['success']:
            return HttpResponse('success')
        else:
            return HttpResponse('failed')

def recaptha(req):
    import urllib, urllib.request, urllib.parse, json
    recaptcha_response = req.POST.get('g-recaptcha-response')
    url = 'https://www.google.com/recaptcha/api/siteverify'
    values = { 
        'secret': TODO, # GOOGLE RECAPTHA SECRET KEY
        'response': recaptcha_response
    }   
    data = urllib.parse.urlencode(values).encode('utf-8')
    req = urllib.request.Request(url, data)
    response = urllib.request.urlopen(req)
    result = json.loads(response.read().decode('utf-8'))
    return result

Template

テンプレートファイル。APIのJavaScriptファイルを読み込んでいる。クラス名g-recapthaがチェックボックスが表示される箇所。data-sitekeyにサイトキーを渡す。
data-callbackにチェックボックス押下後に呼び出すJavaScriptの関数を指定できる。これを利用すると、例えばチェックボックスが押下されるまでボタンを無効化し、押下されたらボタンを有効化するという処理を書くことが出来る。

<script src='https://www.google.com/recaptcha/api.js'></script>                                     

<form action="{% url 'index' %}" method="POST">
    {% csrf_token %}
    {{ email_form.email }}
    <div class="g-recaptcha" data-callback="" data-sitekey="TODO: GOOGLE RECAPTHA SITE KEY"></div>
    <input type="submit" value="送信">
</form>

おわりに

以上です。
登録したreCAPTCHAの確認は https://www.google.com/recaptcha/admin#list から行えます。

参照

投稿者名です。64字以内で入力してください。

必要な場合はEメールアドレスを入力してください(全体に公開されます)。

投稿する内容です。

スポンサーリンク

スポンサーリンク

スポンサーリンク

スポンサーリンク