Skip to content

xeBuz/Flask-Validator

Repository files navigation

Flask-Validator

PyPi status PyPI version Travis Documentation Status Requirements Status Coverage Status Code Climate Codacy Badge Code Climate technical debt PyPI - Downloads PyPI - Python Version GitHub license


Description

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.

Installation

pip install flask-validator

Documentation

For the online documentation, follow this link

Basic usage

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'

Exceptions

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.

Message Exception

The fourth parameter allow a custom message exception, with a few variables available

  • old_value: value previous to the modification
  • new_value: value provided (with the error)
  • key: the column name
  • field: object.column

Available Constraints

  • 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

Custom Validators

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'

Pause the validation

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