django admin的任何验证码插件?
我想在管理员登录时添加此功能。
答案 0 :(得分:3)
你可以覆盖AdminSite类并设置你的login_form和login_template。但在这种情况下,您需要通过自定义AdminSite对象注册所有模型。
答案 1 :(得分:1)
你看过Simple Captcha吗?
答案 2 :(得分:1)
一个想法可能是强制/ admin使用另一个登录视图(http://djangosnippets.org/snippets/2127/)。我想你必须在该片段中导入login_required装饰器。
现在,您可以提供自己的login view,即实现重新计算。 您可以轻松地将其集成到自定义登录表单中(http://code.google.com/intl/de-DE/apis/recaptcha/docs/display.html)。 在您的身份验证视图中,您只需要检查recaptcha api中的返回值(它返回“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
如果用户输入在验证码上返回false,则可以使用变量“captcha”在模板中呈现错误消息。您还必须定义自己的LoginUserForm以在单独的自定义HTML模板中使用。
我认为,这只是一个小小的hacky概念,更优雅的方式是编写自定义验证码小部件。
希望这些想法可能会带来可能的解决方案。