Data validator for Flask using SQL-Alchemy, working at Model component with events, preventing invalid data in the columns. The extension works with event listeners from SQLAlchemy.
pip install flask-validator
For the online documentation, follow this link
The most performant way to set up your validations is during the SQLAlchemy special directive_ __declare_last__
, it occurs after mappings are assumed to be completed and the 'configure' step has finished.
from flask_validator import ValidateInteger, ValidateString, ValidateEmail
class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80))
code = db.Column(db.Integer())
email = db.Column(db.String(125))
def __init__(self, string, integer):
self.string = string
self.integer = integer
@classmethod
def __declare_last__(cls):
ValidateString(User.name)
ValidateInteger(User.code)
ValidateEmail(User.email)
user = User('Arthur Dent', 42, 'arthur@babelfish.org')
user.name = 666
print user.name
# 'Arthur Dent'
user.name = 'Zaphod Beeblebrox'
print user.name
# 'Zaphod Beeblebrox'
Every Constraint has a parameter to throw an exception everytime the validation fails, for example:
ValidateNumeric(Table.field, False, True, "Message")
The third parameter enables this feature and throw a ValidateError
exception, otherwise it will fails silently.
The fourth parameter allow a custom message exception, with a few variables available
old_value
: value previous to the modificationnew_value
: value provided (with the error)key
: the column namefield
: object.column
- Types
- ValidateInteger
- ValidateNumeric
- ValidateString
- ValidateBoolean
- Numeric
- Validatelength
- ValidateNaN
- Comparision
- ValidateLessThan
- ValidateLessThanOrEqual
- ValidateGreaterThan
- ValidateGreaterThanOrEqual
- Internet
- ValidateEmail
- ValidateIP
- ValidateURL
- Location
- ValidateCountry
- ValidateTimezone
- ValidateLocale
- Financial
- ValidateCreditCard
- ValidateCurrency
- ValidateIBAN
- ValidateBIC
- Others
- ValidateUUID
- ValidateISBN'
- ValidateRegex
- ValidateRange
You will be able to create customs validator implementing the class Validator.
You must define your own method check_value()
and if you are receiving any argument, you also must call the parent __init__()
from flask_validator import Validator
class ValidateAorB(Validator)
def __init__(self, field, useless, allow_null=True, throw_exception=False, message=None, interpolate_message):
self.useless = useless
Validator.__init__(self, field, allow_null, throw_exception, message, interpolate_message):
def check_value(self, value):
return if value in ['A', 'B']
class ValidateA(Validator)
def check_value(self, value):
return if value == 'A'
The extension has two methods to stop and restart the listener.
class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80))
code = db.Column(db.Integer())
email = db.Column(db.String(125))
def __init__(self, string, integer):
self.string = string
self.integer = integer
# Initialize the validator
validate = ValidateString(User.name)
# Do something validated
# ...
validate.stop()
# Assign values without being validated
# ...
validate.start()
# Re-enabled the listener