Skip to content
Validator for SQLAlchemy Models
Python
Branch: master
Clone or download
xeBuz and renovate-bot Pin dependency Flask-SQLAlchemy to ==2.4.1 (#55)
Pin dependency Flask-SQLAlchemy to ==2.4.1

Co-authored-by: Renovate Bot <bot@renovateapp.com>
Co-authored-by: Jesús Roldán <jesus.roldan@gmail.com>
Latest commit 5f74f78 Jan 3, 2020
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
docs
examples Updated tests Oct 27, 2018
flask_validator Added ValidateBIC Oct 27, 2018
test
.codeclimate.yml Remove examples from codeclimate Oct 27, 2018
.gitignore Added virtualenv to gitignore Nov 11, 2015
.travis.yml Upgrading version to test Oct 14, 2019
CHANGES
CODE_OF_CONDUCT.md Create CODE_OF_CONDUCT.md Jul 14, 2017
LICENSE Initial commit Oct 5, 2015
MANIFEST Test Nov 23, 2015
README.md Update README.md Jan 3, 2020
renovate.json
requirements.txt Pin dependency Flask-SQLAlchemy to ==2.4.1 Jan 3, 2020
setup.cfg
setup.py Update dependency isbnlib to v3.9.10 (#53) Jan 3, 2020

README.md

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):
        self.useless = useless

        Validator.__init__(self, field, allow_null, throw_exception, 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
You can’t perform that action at this time.