嘛 最近写 web.py 写的多- - 验证码部分自然要用 reCAPTCHA 了… 搜了下 reCAPTCHA-client 这个包是官方提供的 SDK … 但是基本没有什么文档… 下面是探索结果:
安装:
1
| # easy_install recaptcha-client
|
关于这个包的其他信息见这里.
先扔代码再讲:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
| import os
import web
from web.contrib.template import render_jinja
from recaptcha.client import captcha
BasePATH = os.path.dirname(__file__)
render = render_jinja(os.path.join(BasePATH, 'tpl'),
encoding = 'utf-8')
def GetIP():
if 'X-REAL-IP' in web.ctx.environ:
return web.ctx.environ['X-REAL-IP']
else:
return web.ctx.environ['REMOTE_ADDR']
class reCAPTCHAHandler(object):
def GET(self):
captcha.API_SERVER = "http://api.recaptcha.net"
chtml = captcha.displayhtml(public_key = RECAPTCHA_PUBLIC_KEY, \
use_ssl = False, \
error = None)
return render.recaptcha(locals())
def POST(self):
data = web.input()
challenge = data['recaptcha_challenge_field']
response = data['recaptcha_response_field']
remoteip = GetIP()
cResponse = captcha.submit(challenge, \
response, \
RECAPTCHA_PRIVATE_KEY, \
remoteip)
if cResponse.is_valid:
return "Success!"
else:
error = cResponse.error_code
recaptcha = captcha.displayhtml(public_key = RECAPTCHA_PUBLIC_KEY, \
use_ssl = False, \
error = error)
return render.signup(locals())
urls = (
'/', 'reCAPTCHAHandler',
)
app = web.application(urls, globals())
application = app.wsgifunc()
|
先说 GET 部分, captcha.API_SERVER 可以指定 reCAPTCHA 调用的 API 地址, 默认用的是 http://www.google.com/recaptcha/api ( 还有一个 API_SSL_SERVER 用来指定 use_ssl = True 的时候访问的服务器 )
由于众所周知的原因… www.google.com 会不稳定… 所以换到 http://api.recaptcha.net 会好一点..
captcha.displayhtml 用来返回 reCAPTCHA 的显示代码 直接插入到模板就好了
然后是 POST 部分..
GetIP() 是写的一个获取 IP 的函数.. 貌似在 django 里面用的是 os.environ[“remote_addr”] 不知道为何我本机测试没有这个值 囧..
submit 函数用来向 reCAPTCHA 服务器发起验证. 验证之后可以根据返回的对象的 is_vaild 来判断是否正确..
返回的 error_code 是用于错误的时候让 reCAPTCHA 显示错误信息…嗯 = =
嘛 于是又结束了 - -