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.
Вот и все, простейшая валидация формы готовоа.