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

#字段类
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. The Golden Age CodeForces - 813B (数学+枚举)

    Unlucky year in Berland is such a year that its number n can be represented as n = xa + yb, where a  ...

  2. [2017BUAA软工]个人项目:数独

    一.项目地址 https://github.com/Slontia/Sudoku 附加作业(GUI):https://github.com/Slontia/SudokuGUI 二.开发时间 PSP2. ...

  3. HDU 2033 人见人爱A+B

    http://acm.hdu.edu.cn/showproblem.php?pid=2033 Problem Description HDOJ上面已经有10来道A+B的题目了,相信这些题目曾经是大家的 ...

  4. Windows10下Docker监控管理工具:Hyper-V管理器

    用Hyper-V管理器监控管理Docker,看到最新的MobyLinuxVM了. 今天启动Docker,出现内存不足的问题,调节内存配置即可.

  5. Wshshell 脚本简单学习

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

  6. python2.7.x的字符串编码到底什么鬼?(中文和英文的处理)

    一直以来我其实一直对python的编码弄得非常晕,能正常编码,也能处理一些情况.但是始终不明白有些问题究竟为何出,原因是什么,为什么要这样用. 今天晚上正好好好研究了一番解答了自己心中的困惑. Q:p ...

  7. spring cloud实战与思考(五) JWT之携带敏感信息

    需求: 需要将一些敏感信息保存在JWT中,以便提高业务处理效率. 众所周知JWT协议RFC7519使用Base64Url对Header和Payload的Json字符串进行编解码.A JWT is re ...

  8. 写给正在入坑linux系统的伙伴

    光阴似箭,时光如梭,转年出来工作已经3年了.从一个职场新人慢慢熟悉职场的工作方式,适应职场工作的环境,学习了很多知识,也总结了很多经验.现在的目标就是一步一个脚印,慢慢打磨自己,希望早日成为取代其他人 ...

  9. BZOJ4569 SCOI2016萌萌哒(倍增+并查集)

    一个显然的暴力是用并查集记录哪些位之间是相等的.但是这样需要连nm条边,而实际上至多只有n条边是有用的,冗余过多. 于是考虑优化.使用类似st表的东西,f[i][j]表示i~i+2^j-1与f[i][ ...

  10. wamp下php报错session_start(): open(d:/wamp/tmp\sess_ku776hvb06ko4lv9d11e7mnfj1, O_RDWR) failed: No such file or directory

    报错提示 session_start(): open(d:/wamp/tmp\sess_ku776hvb06ko4lv9d11e7mnfj1, O_RDWR) failed: No such file ...