文章内容

2020/1/15 21:21:45,作 者: 黄兵

在Flask中使用Google reCAPTCHA

转到https://www.google.com/recaptcha/admin并将您的域注册为reCAPTCHA V2网站。复制您的站点和密钥。在下面的代码示例中,我使用config变量GOOGLE_RECAPTCHA_SITE_KEYGOOGLE_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)


文章来源:Google reCAPTCHA for a Flask app

分享到:

发表评论

评论列表