я обнаружил, что был в состоянии сделайте это с превалирующим инструментом, но я не уверен, что это лучший способ. Проблема в том, чтобы сделать это таким образом, что ничто иное не будет проверено, если ошибка будет выполнена. Я могу использовать chained_validators вместо pre_validators, но имеет обратный эффект, когда captcha проверяется только при прохождении всех остальных полей.
class LoginForm(formencode.Schema):
...
captcha = formencode.validators.String(if_missing=None)
pre_validators = [validators.Captcha('captcha')]
class Captcha(formencode.validators.FormValidator):
def __init__(self, captcha_name):
self.captcha_name = captcha_name
def validate_python(self, value_dict, state):
if not captcha.test_captcha(value_dict.get(self.captcha_name)):
raise formencode.Invalid('Captcha error', self.captcha_name, state, error_dict={self.captcha_name: 'Captcha did not match'})