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