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-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\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']
flask 后台表单验证模块的更多相关文章
- python运维开发(十九)----Django后台表单验证、session、cookie、model操作
内容目录: Django后台表单验证 CSRF加密传输 session.cookie model数据库操作 Django后台Form表单验证 Django中Form一般有2种功能: 1.用于做用户提交 ...
- java后台表单验证工具类
/** * 描述 java后台表单验证工具类 * * @ClassName ValidationUtil * @Author wzf * @DATE 2018/10/27 15:21 * @VerSi ...
- flask之表单验证 2018.12.23
#flask的消息闪现依赖于flash库,用户发送的请求方式存储在request模块中 #跳转依赖于redirect模块,还可以通过url_for方法来进行方法上的寻址 from flask impo ...
- flask提交表单验证不通过,以及CSRF攻击原理
学习表单的问题1. 提交表单时怎么都无法验证通过 记录一下,自己的学习bug,主要是因为在模板中书写渲染的语句时,把CSRF的字段名写错了. 因为在模板中书写一些语句是没有提示的,自己手动敲代码容易出 ...
- flask form表单验证
新建forms.py文件 #!/usr/bin/env python #-*-coding:utf--*- #导入模块 from flask_wtf import FlaskForm #FlaskFo ...
- flask web 表单验证 WTForms
简介 WTForms 是一个flask集成框架,或者说是库,用于处理浏览器表单提交的数据,它在flask-WTF的基础上扩展并添加了一些随手可得的精巧帮助函数,这些函数将会是在flask里使用表单更加 ...
- Flask wtforms 表单验证使用
目录 wtforms 使用1(简单版): 使用2(复杂版): wtforms 安装:pip3 install wtforms 使用1(简单版): from flask import Flask, re ...
- 第三百一十一节,Django框架,Form表单验证
第三百一十一节,Django框架,Form表单验证 表单提交 html <!DOCTYPE html> <html lang="en"> <head& ...
- 九 Django框架,Form表单验证
表单提交 html <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
随机推荐
- [Head First Python]6. summary
1- 字典-内置数据结构,数据值与键值关联 键-字典中查找部分 值-字典中数据部分 使用dict()工厂函数或者只用{}可以创建一个空字典 >>> list = {} >> ...
- python笔记之subprocess模块
python笔记之subprocess模块 [TOC] 从Python 2.4开始,Python引入subprocess模块来管理子进程,以取代一些旧模块的方法:如 os.system.os.spaw ...
- 基于方法的LINQ语句
LINQ中的查询方法有两站,一种是使用类似于SQL语句的方式,另一种则是基于方法的语句.基于方法的查询方法使用的是C#中面向对象概念的,主要的方法有: 投影: Select | SelectMany ...
- information_schema.collations 学习
information_schema.collations 表中的每一行对应一个排序规则 1.information_schema.collations 表中学用列: 1.id :排序规则的ID 2. ...
- 怎样使用淘宝npm镜像
淘宝的 NPM 镜像是一个完整的npmjs.org镜像.你可以用此代替官方版本(只读),同步频率目前为 15分钟 一次以保证尽量与官方服务同步. 当前 registry.npm.taobao.org ...
- JS中的的Url传递中文参数乱码,如何获取Url中参数问题
一:Js的Url中传递中文参数乱码问题,重点:encodeURI编码,decodeURI解码: 1.传参页面Javascript代码:<script type=”text/javascript” ...
- 前端MVVM学习之KnockOut(一)
MVVM理解 MVVM即Model-View-viewModel,是微软WPF和MVP(Model-View-Presenter)结合发展演变过来的一种新型架构框架. MVVM设计模式有以下优点: ( ...
- Activiti 5.16用户手册
From :http://www.mossle.com/docs/activiti/ Table of Contents 1. 简介 协议 下载 源码 必要的软件 JDK 6+ Eclipse Ind ...
- 【LeetCode练习题】Pow(x, n)
Pow(x, n) Implement pow(x, n). 计算x的n次方. 解题思路: 考虑到n的值会很大,而且可为正可为负可为0,所以掉渣天的方法就是用递归了. 对了,这题也在<剑指off ...
- Linux MySql安装步骤
本文将以MySQL 5.5.47为例,以CentOS 6.5为平台,讲述MySQL数据库的安装和设置. 源码包方式安装 1.新建MySql用户和用户组 groupadd mysql useradd - ...