Идея может заключаться в том, чтобы заставить / admin использовать другое представление входа в систему (http://djangosnippets.org/snippets/2127/). Я думаю, вам придется импортировать декоратор login_required в этот фрагмент.
Теперь вы можете предоставить свой собственный вид входа , который реализует то есть recaptcha.
Вы можете легко интегрировать его в свою форму входа в систему (http://code.google.com/intl/de-DE/apis/recaptcha/docs/display.html).
В вашем представлении аутентификации вы просто должны проверить возвращаемое значение из API recaptcha (он возвращает «true» или «false» в качестве первой части строки, поэтому разделите его) следующим образом:
import urllib, urllib2
def recaptcha(request, postdata):
rc_challenge = postdata.get('recaptcha_challenge_field','')
rc_user_input = postdata.get('recaptcha_response_field', '').encode('utf-8')
url = 'http://www.google.com/recaptcha/api/verify'
values = {'privatekey' : 'XXXXXXXXXXXXXXXXXXXXXXX', 'remoteip': request.META['REMOTE_ADDR'], 'challenge' : rc_challenge, 'response' : rc_user_input,}
data = urllib.urlencode(values)
req = urllib2.Request(url, data)
response = urllib2.urlopen(req)
result = response.read().split()[0]
response.close()
return result
По вашему мнению, проверьте следующие данные POST:
def login_view(request, template_name="login.html"):
if request.method == 'POST':
postdata = request.POST.copy()
captcha = recaptcha(request, postdata)
form = LoginUserForm(request, postdata)
if captcha == "false":
return render_to_response(template_name, locals(),
context_instance=RequestContext(request))
if form.is_valid():
# do authentication here
else:
# just display the login_form on GET request
Вы можете использовать переменную "captcha", чтобы отобразить сообщение об ошибке в вашем шаблоне, если пользовательский ввод вернул false на капче. Вы также должны определить свой собственный LoginUserForm для использования в отдельном пользовательском HTML-шаблоне.
Это всего лишь маленькая хакерская концепция из моей головы, я думаю, более элегантным способом было бы написать собственный виджет капчи.
Надеюсь, что эти мысли могут привести к возможному решению.