Flask中使用reCAPTCHA

实际上Flask-wtf中已经整合了Google的reCAPTCHA。即

flask_wtf.recaptcha.RecaptchaField
,它内置了一个
Recaptcha
validator。

你只需配置一下public_key(RECAPTCHA_PUBLIC_KEY)和secret_key(RECAPTCHA_PRIVATE_KEY):

app = Flask(__name__)

app.config["RECAPTCHA_PRIVATE_KEY"] = 'xxxxxxxxxxxxxxxxxxxxxx'
app.config["RECAPTCHA_PUBLIC_KEY"] = 'xxxxxxxxxxxxxxxxxxxxxx'

在自己定义的Form中加上这个Field,
class MyForm(FlaskForm):
    # something
    # ...
    recaptcha = recaptcha.RecaptchaField()

然后模版中渲染,
<form action="/somewhere", method="post">
    <!-- something -->
    {{ form.recaptcha }}
    <button type="submit">提交</button>
</form>

 

不过,事情并没有那么简单。由于我大天朝网络方面的问题(你懂的),我们并不能访问Google。所以项目运行起来是看不到reCAPTCHA的身影的。

但是,在网上查找一波之后,有人说改用www.recaptcha.net这个域名可以正常使用reCAPTCHA。事实上是真的。http://waifu2x.udp.jp/这个就印证了。

我去,申请reCAPTCHA密钥时官方给出的JS地址和API地址:

https://www.google.com/recaptcha/api.js

https://www.google.com/recaptcha/api/siteverify

有了新域名还藏着掖着。。。

 

回归正题,Flask-wtf中的Recaptcha validator使用的地址就是上面的www.google.com地址。

JS链接定义的位置在flask_wtf/recaptcha/widgets.py,常量RECAPTCHA_SCRIPT

另一个链接定义的位置在flask_wtf/recaptcha/validators.py,常量RECAPTCHA_VERIFY_SERVER

 

接下来要做的简单了。

你可以直接更改Flask-wtf的源代码:

# flask_wtf/recaptcha/widgets.py
RECAPTCHA_SCRIPT = u'https://www.google.com/recaptcha/api.js'

# 改成
RECAPTCHA_SCRIPT = u'https://www.recaptcha.net/recaptcha/api.js'

# flask_wtf/recaptcha/validators.py
RECAPTCHA_VERIFY_SERVER = 'https://www.google.com/recaptcha/api/siteverify'

# 改成
RECAPTCHA_VERIFY_SERVER = 'https://www.recaptcha.net/recaptcha/api/siteverify'

 

像我这样有强迫症的、不想改模块源代码的同学可以用一下方法:

from flask_wtf import recaptcha

recaptcha.validators.RECAPTCHA_VERIFY_SERVER = 'https://www.recaptcha.net/recaptcha/api/siteverify'
recaptcha.widgets.RECAPTCHA_SCRIPT = 'https://www.recaptcha.net/recaptcha/api.js'

当然,你要保证这段代码会被执行到。

 

关于Flask-wtf使用reCAPTCHA可以去看看文档:

http://flask-wtf.readthedocs.io/en/stable/form.html#recaptcha