CAPTCHA
1. Создайте директорию 'templatetags' с файлом keycaptcha.py
Содержимое keycaptcha.py:
from django import template
from settings import KeyCAPTCHA_PrivateKey, KeyCAPTCHA_UserID
from hashlib import md5
from urllib import urlopen
register = template.Library()
@register.inclusion_tag('keycaptcha.html', takes_context = True)
def show_keycaptcha( context, pars="postbut|capcode" ) :
request = context['request']
st = pars.split( '|' )
session_id = request.session.session_key
ra = request.META['REMOTE_ADDR']
s1 = md5( session_id + ra + KeyCAPTCHA_PrivateKey ).hexdigest()
s2 = md5( session_id + KeyCAPTCHA_PrivateKey ).hexdigest()
return {
'kc_button_id':st[0],
'kc_input_id':st[1],
'kc_user_id':KeyCAPTCHA_UserID,
'kc_s1':s1,
'kc_s2':s2,
'kc_session_id':session_id }
show_keycaptcha.is_safe = True
def validate_keycaptcha( capcode ) :
cap = capcode.split('|')
if len( cap ) < 3 : return False
valid_cap_sign = md5( 'accept' + cap[1] + KeyCAPTCHA_PrivateKey + cap[2] ).hexdigest()
if valid_cap_sign <> cap[0] : return False
if cap[2].find( 'http://' ) == 0 :
try :
f = urlopen( cap[2] + cap[1] )
st = f.read()
f.close()
except :
return False
if st <>'1' : return False
else : return False
return True
2. Создайте шаблон keycaptcha в Вашей директории с шаблонами.
Содержимое keycaptcha.html:
<!-- KeyCAPTCHA code (www.keycaptcha.com)-->
<input id="capcode" type="hidden" name="capcode" value="123" />
<script language="JavaScript">
var s_s_c_user_id = '{{kc_user_id}}';
var s_s_c_session_id = '{{kc_session_id}}';
var s_s_c_captcha_field_id = '{{kc_input_id}}';
var s_s_c_submit_button_id = '{{kc_button_id}}';
var s_s_c_web_server_sign = '{{kc_s1}}';
var s_s_c_web_server_sign2 = '{{kc_s2}}';
</script>
<script language=JavaScript src="https://backs.keycaptcha.com/swfs/cap.js"></script>
<!-- end of KeyCAPTCHA code-->
3. Отредактируйте файл settings.py:
...
from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS
# Replace PUT_YOUR_PRIVATE_KEY_HERE and PUT_YOUR_KEYCAPTCHA_USER_ID_HERE
# with proper values from your keycaptcha.com accont
KeyCAPTCHA_PrivateKey = PUT_YOUR_PRIVATE_KEY_HERE
KeyCAPTCHA_UserID = PUT_YOUR_USER_ID_HERE
TEMPLATE_CONTEXT_PROCESSORS += (
"django.core.context_processors.request",
)
...
4. Добавьте поле 'capcode' в Вашу форму:
capcode = forms.CharField( label= 'captcha',
max_length=1000,
required=True,
widget=forms.TextInput(attrs={'type':'hidden'})
)
и clean функцию для него:
def clean_capcode(self):
from templatetags.keycaptcha import validate_keycaptcha
capcode = self.cleaned_data['capcode']
if not validate_keycaptcha( capcode ) :
raise forms.ValidationError( "The solution of task you submitted was incorrect." )
return ''
5. Добавьте {% load keycaptcha %} в Ваш шаблон и используйте тэг {% show_keycaptcha %} для отображения капчи
6. Добавьте id="postbut" в кнопку отправки формы.
|