zoukankan      html  css  js  c++  java
  • flask 后台表单验证模块

    我不想直接用flask的wtf模块,太大,功能太多,用不了。但后台也不能不做验证吧,我比较懒,不想一行一行写代码验证,所以就写了一个验证模块,对于小项目也够用了

    # encoding=utf-8
    
    # 这是一个简单的后台验证框架,因为前台的话要用ajax处理,那么后台就不需要复杂的表单处理了
    
    
    # 基础表单类,具体验证表单继承它
    from flask import session
    
    
    class BaseForm(object):
        def __init__(self,form=None):
    
            self.form = form
            self.fields = []
            self.errors = []  # 错误信息存放的地方
            self.init()
    
        def init(self):
            if not self.form:
                return False
    
            # 给表单赋值
            for field_name in dir(self):
                field = self.__getattribute__(field_name)
                if isinstance(field,Field):
                    if field_name in self.form:
                        field.data = self.form[field_name]
                        self.fields.append((field_name,field.validate))
    
            # 验证自定义的以validate_开头的方法
            for validate_method in dir(self):
                if validate_method.startswith('validate_'):
                    self.fields.append((validate_method,self.__getattribute__(validate_method)))
    
    
        # 验证入口
        def validate(self):
            status = True
            for field_name,validate_method in self.fields:
                status = validate_method() and status
                if not status:
                    print field_name,status
                    return False
            return status
    
    # 字段类,主要提供字段的各种验证和约束
    class Field(object):
        def __init__(self,label=None,type='text',validators={},description=None,data=''):
            self.data = data
            self.label = label
            self.type = type
            self.validators = validators
            self.description = description
    
        # 验证入口,验证该字段所有的约束条件
        def validate(self):
            status = True
            for method_name,param in self.validators.items():
                status = self.__getattribute__(method_name)(param) and status
                if not status:
                    print method_name,status
                    return True
            return status
    
        # 验证数据是否复合正则表达式
        def __rule(self,re_str):
            import re
    
            pattern = re.compile(re_str)
            match = pattern.match(self.data)
            if match:
                return True
            return False
    
        # 对开提供的正则表达式模块
        def regex(self,re_str):
            return self.__rule(re_str)
    
        # 是否为数字
        def digits(self,status=True):
            return self.__rule(r"d+")
    
        # 是否是链接
        def url(self,status=True):
            re_str = r"^(https?|s?ftp)://(((([a-z]|d|-|.|_|~|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF])|(%[da-f]{2})|[!$&'()*+,;=]|:)*@)?(((d|[1-9]d|1dd|2[0-4]d|25[0-5]).(d|[1-9]d|1dd|2[0-4]d|25[0-5]).(d|[1-9]d|1dd|2[0-4]d|25[0-5]).(d|[1-9]d|1dd|2[0-4]d|25[0-5]))|((([a-z]|d|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF])|(([a-z]|d|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF])([a-z]|d|-|.|_|~|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF])*([a-z]|d|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF]))).)+(([a-z]|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF])|(([a-z]|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF])([a-z]|d|-|.|_|~|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF])*([a-z]|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF]))).?)(:d*)?)(/((([a-z]|d|-|.|_|~|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF])|(%[da-f]{2})|[!$&'()*+,;=]|:|@)+(/(([a-z]|d|-|.|_|~|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF])|(%[da-f]{2})|[!$&'()*+,;=]|:|@)*)*)?)?(?((([a-z]|d|-|.|_|~|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF])|(%[da-f]{2})|[!$&'()*+,;=]|:|@)|[uE000-uF8FF]|/|?)*)?(#((([a-z]|d|-|.|_|~|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF])|(%[da-f]{2})|[!$&'()*+,;=]|:|@)|/|?)*)?$"
            return self.__rule(re_str)
    
        # 是否是邮箱
        def email(self,status=True):
            re_str = r"^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$"
            return self.__rule(re_str)
    
        # 是否为空
        def not_null(self,status):
            if not status:
                return True
            if not self.data:
                return False
            if hasattr(self.data,'replace') and len(self.data.replace(' ','')) < 0:
                return False
            if len(self.data) == 0:
                return False
            return True
    
        # 最小长度
        def min_length(self,min=-1):
            return self.not_null(True) and len(self.data) >= min
    
        # 长度范围
        def length_range(self,range=[]):
            if self.not_null(True) and len(range) == 2:
                data_length = len(self.data)
                return data_length >= range[0] and data_length <= range[1]
            return False
    
        # 最大长度
        def max_length(self,max):
            return self.not_null(True) and len(self.data) <= max
    
        # 最小值
        def min(self,min):
            try:
                return int(self.data) >= min
            except Exception,e:
                print e
                return False
    
        # 最大值
        def max(self,max):
            try:
                return int(self.data) <= max
            except Exception,e:
                print e
                return False
    
        # 值范围
        def data_range(self,range=[]):
            try:
                data = int(self.data)
                if len(range) == 2:
                    return data >= range[0] and data <= range[1]
                return False
            except Exception,e:
                print e
                return False
    
        # 是否等于field
        def equal_to(self,field):
            return self.data == field.data
    
        # 是否为规定的值
        def choices(self,args=[]):
            return self.data in args
    
        # 检查多选框
        def checked(self,status=True):
            if not status:
                return True
            return self.data in [1,'y','yes','true']
  • 相关阅读:
    NSURLConnection实现文件上传和AFNetworking实现文件上传
    scrollToItemAtIndexPath: atScrollPosition: animated:
    UIViewControllerTransitioningDelegate, UIViewControllerAnimatedTransitioning
    界面传值时数组赋值问题
    安装cocoapods遇到两大坑-Ruby版本升级和Podfile的配置
    iOS通知的整理笔记
    iOS简单实现毛玻璃效果
    iOS模态弹出半透明视图控制器
    友盟SDK实现分享
    iOS 本地存储四种方法
  • 原文地址:https://www.cnblogs.com/bergus/p/4751767.html
Copyright © 2011-2022 走看看