文章内容
2020/1/15 21:21:45,作 者: 黄兵
在Flask中使用Google reCAPTCHA
转到https://www.google.com/recaptcha/admin并将您的域注册为reCAPTCHA V2网站。复制您的站点和密钥。在下面的代码示例中,我使用config变量GOOGLE_RECAPTCHA_SITE_KEY和GOOGLE_RECAPTCHA_SECRET_KEY。调整配置以使用自己的reCAPTCHA密钥。
在您的Jinja模板中,将此添加到您的<head>:
<script src='https://www.google.com/recaptcha/api.js'></script>并将其添加到表单内的Jinja模板中,例如您的登录或注册表单:
<div class="g-recaptcha" data-sitekey="GOOGLE_RECAPTCHA_SITE_KEY"></div>创建一个装饰器函数,将用于装饰您的视图函数:
import requests
from functools import wraps
from flask import flash, request
from config.settings import GOOGLE_RECAPTCHA_SECRET_KEY
def check_recaptcha(f):
"""
Checks Google reCAPTCHA.
:param f: view function
:return: Function
"""
@wraps(f)
def decorated_function(*args, **kwargs):
request.recaptcha_is_valid = None
if request.method == 'POST':
data = {
'secret': GOOGLE_RECAPTCHA_SECRET_KEY,
'response': request.form.get('g-recaptcha-response'),
'remoteip': request.access_route[0]
}
r = requests.post(
"https://www.google.com/recaptcha/api/siteverify",
data=data
)
result = r.json()
if result['success']:
request.recaptcha_is_valid = True
else:
request.recaptcha_is_valid = False
flash('Invalid reCAPTCHA. Please try again.', 'error')
return f(*args, **kwargs)
return decorated_function最后一步是装饰您要使用reCAPTCHA request.recaptcha_is_valid的一个或多个视图并测试真实值:
@user.route('/login', methods=['GET', 'POST'])
@check_recaptcha
def login():
"""User login."""
if form.validate_on_submit() and request.recaptcha_is_valid:
# login user...
return render_template('user/login.jinja2', form=form)
评论列表