DevGang
Авторизоваться

Flask, WTForms: валидируем reCAPTCHA на сервере

Довольно часто требуется подключить reCAPTCHA в свои приложения и валидировать формы, с учотом введеной капчи.

Если форм на проекте больше одной, копировать код из формы в форму, не так удобно. Я в свою очередь сделал промежуточный класс, для проверки токена и наследования остальных форм. 

Для валидации присланного токена, нужно отправить запрос в API на https://www.google.com/recaptcha/api/siteverify

Делаем функцию отправки и обработки результата:

import requests
import json


def check_recapcha(response, remoteip):
    return json.loads(requests.post('https://www.google.com/recaptcha/api/siteverify', data=dict(
        secret='SECRET_CODE',
        response=response.get('g-recaptcha-response'),
        remoteip=remoteip
    )).text)['success']

С помощью модуля requests отправляем POST запрос

  • secret - Секретный ключ на сервисе
  • response - Значение "g-recaptcha-response" из формы на клиенте
  • remoteip - IP-адресс проверяемого пользователя (вашего сайта)

Функция готова, осталось сделать промежуточный класс формы:

from app.helper.check_recapcha import check_recapcha

from wtforms import Form
from flask import request


class BaseForm(Form):
    def validate(self):
        success = super(Form, self).validate()

        if success and 'g-recaptcha-response' in request.form:
            success = check_recapcha(
                request.form,
                request.remote_addr
            )

        return success

В валидаторе формы проверяем что форма валидна и если в request.form присутствует ключь g-recaptcha-response, делаем запрос на проверку.

Вот собственно и все, теперь можно его использовать в любой форме, досточно сделать наследование от этого класса:

from app.form import BaseForm

from flask import request
from wtforms import StringField

class ArticleForm(BaseForm):
	name = StringField('name')


@app.route('/create-article', methods=['POST'])
def create_article_handler():
	form = ArticleForm(request.form)

	if form.validate():
		...

На клиенте соответственно:

<!DOCTYPE html>
<html>
	<head>
		<script src='https://www.google.com/recaptcha/api.js'></script>
	</head>
	<body>
		<form action="/create-article" method="POST">
			<input type="text" name="name" />

			<div class="g-recaptcha" data-sitekey="{{ CLIENT_SECRET }}"></div>

			<button type="submit">Создать</button>
		</form>
	</body>
</html>
</html>

После инициализации скриптов в

подставится инпут рекаптчи с именем g-recaptcha-response.

Вот и все, простейшая валидация формы готовоа.

 

#Flask
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

В этом месте могла бы быть ваша реклама

Разместить рекламу