各个字段类,含正则和验证方法

#字段类
class IPField:
REGULAR = "^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}" def __init__(self,error_dict=None,required=True):
self.error_dict={}
if error_dict:
self.error_dict.update(error_dict)
self.required=required
self.error=None
self.is_valid=False
self.value=None def validate(self,name,input_value):
if not self.required: #允许为空
if input_value.strip():
ret = re.match(IPField.REGULAR, input_value)
if ret:
self.is_valid = True
self.value = ret.group()
else:
if self.error_dict.get('valid', None):
self.error = self.error_dict['valid']
else:
self.error = "%s is invalid" % name
else:
self.is_valid = True
self.value=input_value
else: #不允许为空
if not input_value.strip():
if self.error_dict.get('required',None):
self.error=self.error_dict['required']
else:
self.error="%s is required"%name
else:
ret = re.match(IPField.REGULAR,input_value)
if ret:
self.is_valid=True
self.value=ret.group()
else:
if self.error_dict.get('valid',None):
self.error=self.error_dict['valid']
else:
self.error="%s is invalid"%name #可以含有多个文件名
class FileField:
REGULAR = "^(\w\.pdf)|(\w\.mp3)|(\w\.py)$" def __init__(self,error_dict=None,required=True):
self.error=None
self.success_file_name_list={}
self.value=None
self.is_valid=True#后面只要有一个错误,就是错
self.required=required
self.error_dict={}
if error_dict:
self.error_dict.update(error_dict) def validate(self,name,all_file_name_list):#all_file_name_list所有文件文件名
if not self.required:
# if not input_value.strip():
# ret=re.match(FileField.REGULAR,input_value)
# if ret:
# self.is_valid=True
# self.value=input_value
# else:
# if self.error_dict.get('valid',None):
# self.error=self.error_dict['valid']
# else:
# self.error="%s is invalid"%name
# else:
# self.is_valid=True
# self.value=input_value
if not all_file_name_list:
self.is_valid=True
else:
#循环匹配所有
for input_value in all_file_name_list:
ret = re.match(FileField.REGULAR, input_value)
if ret:
self.success_file_name_list.append(input_value)
else:
self.is_valid=False
if self.error_dict.get('valid', None):
self.error = self.error_dict['valid']
else:
self.error = "%s is invalid" % name
break
else:
if not all_file_name_list:
self.is_valid=False
if self.error_dict.get('required',None):
self.error=self.error_dict['required']
else:
self.error="%s is required"%name
else:
#循环匹配所有
for input_value in all_file_name_list:
ret = re.match(FileField.REGULAR, input_value)
if ret:
self.success_file_name_list.append(input_value)
else:
self.is_valid=False
if self.error_dict.get('valid', None):
self.error = self.error_dict['valid']
else:
self.error = "%s is invalid" % name
break #字符串验证
class StringField:
REGULAR = "(.*)" def __init__(self,error_dict=None,required=True):
self.is_valid=False
self.value=None
self.error=None
self.error_dict={}
if error_dict:
self.error_dict.update(error_dict)
self.required=required def validate(self,name,input_value):
if not self.required: #允许为空
if input_value.strip():
ret = re.match(StringField.REGULAR,input_value)
if ret:
self.is_valid=True
self.value=input_value
else:
if self.error_dict.get('valid',None):
self.error=self.error_dict['valid']
else:
self.error="%s is invalid"%name
else:
self.is_valid=True
self.value=input_value
else:#不允许为空
if not input_value.strip():
if self.error_dict.get('required',None):
self.error=self.error_dict['required']
else:
self.error="%s is required"%name
else:
ret=re.match(StringField,input_value)
if ret:
self.is_valid=True
self.value=input_value
else:
if self.error_dict.get('valid',None):
self.error=self.error_dict['valid']
else:
self.error="%s is invalid"%name #复选框验证
class CheckBoxField:
def __init__(self,required=True,error_dict=None):
self.is_valid=False
self.error=None
self.required=required
if error_dict:
self.error_dict=error_dict
self.value=None def validate(self,name,input_value):
#用户表单输入的数据可以为空
if not self.required:
self.is_valid=True
self.value=input_value
else:
if not input_value:
if self.error_dict.get('required',None):
self.error=self.error_dict['required']
else:
self.error="%s is required"%name
else:
self.is_valid=True
self.value=input_value

验证类基类

#form验证基类
class BaseForm(object): def check_valid(self,handler):
flag=True
error_message_dict={}
success_dict={}
for key,regular in self.__dict__.items():
#用户输入值
if type(regular) == CheckBoxField:
input_val=handler.get_arguments(key)
elif type(regular)==FileField:
#包含上传多个文件[{'body':'','filename':''},{'body':'','filename':''}]
file_list=handler.request.files.get(key)
#获取其中的文件名
input_val=[]
for item in file_list:
input_val.append(item['filename'])
else:
input_val=handler.get_argument(key) regular.validate(key,input_val)
if regular.is_valid:
success_dict[key]=regular.value
else:
flag=False
error_message_dict[key]=regular.error return flag,success_dict,error_message_dict

具体验证类子类:

#form验证类,采用对象
class HomeForm(BaseForm):
def __init__(self):
self.ip = IPField(required=True,error_dict={'required':'数据不为空',"valid":"验证出错"})
self.host=StringField(required=True,error_dict={'required':"主机名必须存在","valid":"这都会出错"})
self.sex=CheckBoxField(required=True,error_dict={'required':'复选框必须选择'})
# self.file=FileField(required=True,error_dict={'valid':'文件格式不正确'})

其他业务:

#采用HomeForm验证类
class HomeHandler(tornado.web.RequestHandler):
def get(self):
self.render('home.html',error_dict=None) def post(self, *args, **kwargs):
formCk = HomeForm()
is_valid,success_dict,error_dict=formCk.check_valid(self)
if is_valid:
print(success_dict)
self.write("ok")
else:
print(error_dict)
self.render('home.html',error_dict=error_dict)
settings={
'static_path':'statics',
'template_path':'views',
} application=tornado.web.Application([
(r"/index",IndexHandler),
(r"/home",HomeHandler),
],**settings) if __name__ == "__main__":
application.listen()
tornado.ioloop.IOLoop.instance().start()

前端代码:

    <form method="post" action="/home">
<input type="text" placeholder="主机" name="host"/>
<input type="text" placeholder="IP" name="ip">
<input type="checkbox" name="sex" value=""/>男
<input type="checkbox" name="sex" value=""/>女
<input type="file" name="file">
<input type="file" name="file">
<span>
{% if error_dict and 'ip' in error_dict %}
{{error_dict['ip']}}
{% end %}
{% if error_dict and 'host' in error_dict %}
{{error_dict['host']}}
{% end %}
</span>
<input type="submit" value="提交"/>
</form>

python---自定义字段验证的更多相关文章

  1. Django项目:CRM(客户关系管理系统)--38--30PerfectCRM实现King_admin编辑自定义字段验证

    # kingadmin.py # ————————04PerfectCRM实现King_admin注册功能———————— from crm import models #print("ki ...

  2. 27)django-form操作示例(动态Select数据,自定义字段验证,全局验证等)

    1)普通传递select数据 # -*- coding:utf-8 -*- __author__ = 'shisanjun' from django import forms from django. ...

  3. django 表单验证和字段验证

    表单验证和字段验证 表单验证发生在数据验证之后.如果你需要自定义这个过程,有几个不同的地方可以修改,每个地方的目的不一样.表单处理过程中要运行三种类别的验证方法.它们通常在你调用表单的is_valid ...

  4. Django---ORM的常用字段和自定义字段,DjangoORM字段与数据库类型对应,字段参数和Meta的参数,Django的admin操作,13中orm操作方法,单标的双下方法

    Django---ORM的常用字段和自定义字段,DjangoORM字段与数据库类型对应,字段参数和Meta的参数,Django的admin操作,13中orm操作方法,单标的双下方法 一丶ORM常用字段 ...

  5. Python--day68--Django ORM常用字段、不常用的字段、自定义字段

    ORM和数据库的对应关系: Django ORM 常用字段和参数 常用字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建 ...

  6. SharePoint 2013 图文开发系列之自定义字段

    SharePoint使用的优势,就在于开箱即用.快速搭建,SharePoint自身为我们提供了很多字段类型,已经很丰富了.但是,在实际应用中,我们还需要一些功能特殊的字段,下面,我们简单介绍下字段的开 ...

  7. Java自定义表单、自定义字段

    最近想实现用户自定义数据库中的字段,我想大部分人第一想到的就是EAV(Entity-Attribute-Value),这种方式对于写一个小的毕业设计应该还可以使用,当然也有很多CMS系统采用这种方式, ...

  8. [原创]java WEB学习笔记71:Struts2 学习之路-- struts2常见的内建验证程序及注意点,短路验证,非字段验证,错误消息的重用

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  9. webservice安全性之 SoapHeader自定义身份验证

    相信很多开发者都用过WebService来实现程序的面向服务,本文主要介绍WebService的身份识别实现方式,当然本文会提供一个不是很完善的例子,权当抱砖引玉了. 首先我们来介绍webservic ...

  10. ExtJs 自定义Vtype验证

    最近公司开发项目在用ExtJs,碰到验证的就大概的总结了一些常用的验证.自定义的验证主要有两种方式:一种是单字段的自定义验证,另一种是多字段间的验证.对于单字段的验证主要通过regex配置项指定自定义 ...

随机推荐

  1. shiro课程的学习

    1.shiro的课程目标 (1)shiro的整体框架 各组件的概念 (2)shiro 认证 授权的过程 (3)shiro自定义的Reaml Filter (4)shiro session 管理 (5) ...

  2. beta(3/7)

    团队信息 队名:爸爸饿了 组长博客:here 作业博客:here 组员情况 组员1(组长):王彬 过去两天完成了哪些任务 协助后端完成历史记录接口.美食排行榜接口 完成食堂平面图的绘制 确定web端业 ...

  3. 剑指offer:变态跳台阶

    题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法.   思路 首先想到的解决方案是根据普通跳台阶题目改编,因为可以跳任意级,所以要 ...

  4. 速读《构建之法》(Build to win)有感

    通过这两天时间,我粗读了<构建之法>这本书.老实说,对于这样四百多页的一本书,刚开始把这样的任务当作是一种负担,然而当我开始真正接触它时却被它幽默有趣的风格所深深吸引,它不同于以往学习的教 ...

  5. Which path should be used jdk or jre for JAVA_HOME environment variable?

    https://stackoverflow.com/questions/17601827/which-one-should-java-home-to-point-jdk-or-jre 临时变更JAVA ...

  6. Activiti的BPMN演示工具

    场景是这样的:产品经理不懂技术,又不想安装Java以及Eclipse(需要安装Activiti BPMN Designer的插件). 这两天解决.bpmn的解析(BPMNParser)时顺带找到一个顺 ...

  7. windows的cmd下的find命令比bash(win10下的Ubuntu的bash)下的grep比较

    同样的一个catalina文件,windows的cmd下的find命令比bash下的grep要慢,windows确实占下风啊

  8. Windows系统下PHP使用Redis

    参考链接:https://www.cnblogs.com/lhat/p/6402472.html 环境:windows 10  64位操作系统    php 5.4 redis 3.0 1.redis ...

  9. Node fs模块同步读取写入追加

    JS文件中const fs = require("fs");console.log("开始进入文件读取.."); //同步的写入var data = fs.re ...

  10. mysql学习笔记三 —— 数据恢复与备份

    要点: 1.存储引擎2.导入导出3.备份与恢复 查看当前数据库中的所有表use db1:show tables: 1.存储引擎 不同的发动机(引擎)适用的汽车类型不一样. 存储和处理的不同方式.不同的 ...