文章内容
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)
评论列表