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

#字段类
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. Maven+SSM整合.doc

    Maven + SSM整合 1开发环境搭建 1.1Eclipse4.7(Oxygen) + Tomcat8 + Maven3.5.2 2Maven Web项目创建 2.1新建maven项目 2.2 选 ...

  2. MYSQL jdbc autoReconnect

    http://blog.csdn.net/a9529lty/article/details/7104351 http://blog.163.com/huangfei_person/blog/stati ...

  3. Wshshell 脚本简单学习

    WshShell 的简单语法 学习 同事给了一个脚本自动执行  部署命令 感觉挺好的 , 年前一直说要学习一下 但是一直没有学习(自己太懒了) 这次简单总结一下. 创建对象: Set WshShell ...

  4. [转帖] Win10 多桌面转换的快捷键

    http://down.52pk.com/zhishi/52202.shtml win10系统中用户除了可以切换任务之外,还可以进行多桌面切换,就像是切换了电脑屏幕一样,可能网友们还都不知道win10 ...

  5. OA与BPM的区别

      BPM OA 软件架构 JAVA..NET.基于SOA架构 JAVA..NET.PHP.Domino 驱动模式 流程驱动 文档驱动 交互 人与人,人与系统,系统与系统 人与人 软件功能       ...

  6. matplotlib之随机漫步

    # 随机漫步类 from random import choice from matplotlib import pyplot as plt from pylab import mpl from ma ...

  7. python之Map函数

    # map()函数使用举例 # 功能:map()接受一个函数f和一个或多个list,将f依次作用在list的每个元素,得到一个新的列表 # 语法:map(方法名,列表,[列表2]) # 注意:map( ...

  8. BZOJ1798[Ahoi2009]维护序列——线段树

    题目描述     老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成.    有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2 ...

  9. 【Linux】MGR部署脚本

    脚本没有完善,现在只有上半部分的基础环境搭建 [准备条件] 1.三个节点的防火墙关闭 2.原有mysql卸载删除 3.文件夹名字: mgr 所有的源码包都放在mgr的文件夹下 4.文件位置: /roo ...

  10. Educational Codeforces Round 25 A,B,C,D

    A:链接:http://codeforces.com/contest/825/problem/A 解题思路: 一开始以为是个进制转换后面发现是我想多了,就是统计有多少个1然后碰到0输出就行,没看清题意 ...