tornado中form表单验证详解
#!/usr/bin/env python
# _*_ coding:utf-8 _*_
import tornado.web
import tornado.ioloop
import re class BaseForm(object):
def check_valid(self, handle):
flag = True
error_message_dict = {}
success_value_dict = {} for key, regular in self.__dict__.items():
input_value = handle.get_argument(key)
# val = re.match(regular, input_value)
# 把验证方法封装到IPField的对象中
regular.validate(key, input_value)
if regular.is_valid:
success_value_dict[key] = regular.value
else:
error_message_dict[key] = regular.error
flag = False
return flag, success_value_dict, error_message_dict
# 总结:客户端把数据post到服务器端,触发handler的post函数,首先实例化MainForm这个类,得到
# 其对象obj。然后obj调用check_valid(self)方法,并把IndexHandler这个类的对象作为参数传进去,
# check_valid是每个Form都具有的方法,所以抽象出一个BaseForm类,让其他Form类都继承这个类,
# 因此其他Form类的对象也可以调用check_valid方法,当obj调用该方法,先循环obj对象所被封装类的
# 属性,得出一个包含ip,host属性名和IPField,HOSTField的对象的一个字典,对应的是key和regular,
# 以IPField为例,regular就是IPField实例化后的对象,一开始我们是在check_valid这个方法里直接
# 验证所有输入的值,现在转移到IPField的方法里去验证,现在调用check_valid是间接的去验证输入的值,
# 也就是regular.validate(key, input_value),这里我觉得关键是self.__dict__,所有都是围绕它
# 的键值对来操作,只不过regular由原先的正则表达式换成类实例化的对象,而正则表达式也封装到这个类
# 里面,并且这个类的对象通过调用这个类的方法来验证客户端输入的信息 class MainForm(BaseForm):
def __init__(self):
self.ip = IPField(required=True, error_dict={"required": "别闹", "valid": "格式错误"})
self.favor = ChechBoxFiled(required=True, error_dict={'required': "复选框不能为空"}) 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:
# 如果输入的值可以为空,
self.is_valid = True
self.value = input_value else:
# 如果要求输入的值不能为空
if not input_value.strip():
# 如果我输入的值是空值,然后我就去取error_dict里面required对应的值
if self.error_dict.get("required", None):
# 如果在生成IPField对象的时候有初始化required的值,则应用该值
self.error = self.error_dict["required"]
else:
# 否则,默认把ip is required赋值到self.error
self.error = "%s is required" % name
else:
# 如果我输入的值不是空值,那么我就要和正则表达式进行比较
ret = re.match(IPField.REGULAR, input_value)
if ret:
self.is_valid = True
# self.value = ret.group()
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 ChechBoxFiled: 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.value = None
self.is_valid = False def validate(self, name, input_value):
"""
:param name: 字段名 favor
:param input_value: 用户表单中输入的内容,列表None, [1,2]
:return:
""" 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 class IndexHandler(tornado.web.RequestHandler):
def get(self, *args, **kwargs):
self.render("index.html", error_dict=None) def post(self, *args, **kwargs):
obj = MainForm()
is_valid, success_dict, error_dict = obj.check_valid(self)
if is_valid:
print("success", success_dict)
else:
print("error", error_dict)
self.render("index.html", error_dict=error_dict) settings = {
"template_path": "views",
"static_path": "Statics",
"static_url_prefix": "/Statics/", } application = tornado.web.Application([
(r"/index", IndexHandler)
], **settings) if __name__ == '__main__':
application.listen(9001)
tornado.ioloop.IOLoop.instance().start()
tornado中form表单验证详解的更多相关文章
- Django基础,Day5 - form表单投票详解
投票URL polls/urls.py: # ex: /polls/5/vote/ url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, ...
- Vue中Form表单验证无法消除验证问题
iView的表单api给出了一个resetFields方法,用于重置整个表单输入的内容并清除验证提示. 但是有时候需要只消除部分的iview的resetFields方法源码是这样的resetField ...
- Django中的Form表单验证
回忆一下Form表单验证的逻辑: 前端有若干个input输入框,将用户输入内容,以字典传递给后端. 后端预先存在一个Form表单验证的基类,封装了一个检测用户输入是否全部通过的方法.该方法会先定义好错 ...
- 抽屉之Tornado实战(7)--form表单验证
在这里,我们把form表单验证的代码进行工具化了,以后稍微修改一下参数就可以拿来用了 先贴上代码 forms.py from backend.form import fields class Base ...
- ASP.NET MVC Form表单验证与Authorize特性
一.Form表单验证 1.基本概念 表单验证是一个基于票据(ticket-based)[也称为基于令牌(token-based)]的系统.当用户登录系统以后,会得到一个包含基于用户信息的票据(tick ...
- [php基础]PHP Form表单验证:PHP form validator使用说明
在PHP网站开发建设中,用户注册.留言是必不可少的功能,用户提交的信息数据都是通过Form表单提交,为了保证数据的完整性.安全性,PHP Form表单验证是过滤数据的首要环节,PHP对表单提交数据的验 ...
- python26:自定义form表单验证
一.自定义Form的原理 1.1 各种form表单验证比较 只有python提供了form表单验证,其他的都没有提供.django提供的功能还不够强大.最强大的是微软的ASP.NET!我们可以自己写一 ...
- element-ui Form表单验证
element-ui Form表单验证规则全解 element的form表单非常好用,自带了验证规则,用起来很方便,官网给的案例对于一些普通场景完全没问题,不过一些复杂场景的验证还得自己多看文档摸索, ...
- Form表单验证组件
Tyrion是一个基于Python实现的支持多个WEB框架的Form表单验证组件,其完美的支持Tornado.Django.Flask.Bottle Web框架.Tyrion主要有两大重要动能: 表单 ...
随机推荐
- 题解-PKUWC2018 Slay the Spire
Problem loj2538 Solution 在考场上当然要学会写暴力,考虑如果手上已经有了\(a\)张攻击牌和\(b\)张强化牌: 首先强化牌会在攻击牌之前用(废话),其次要将两种牌分别从大往小 ...
- Web.config设置system.webServer
一般情况在iis部署web网站都非常顺利,但是遇到复杂环境,或者被配置过又正在使用的时候,就束手无策了, 因为对IIS和Web.config不熟悉,不知其中要害,导致浪费一天甚至更久的时间去处理一个可 ...
- 空串、null串和isEmpty方法
空串 空串""是长度为0的字符串.可以调用以下代码检查字符串是否为空: if(str.length() == 0) 或 if(str.equals("")) 空 ...
- FHQ Treap摘要
原理 以随机数维护平衡,使树高期望为logn级别 不依靠旋转,只有两个核心操作merge(合并)和split(拆分) 因此可持久化 先介绍变量 ; int n; struct Node { int v ...
- percona mysql server5.7基于gtid的主从复制
配置mysql基于gtid主从复制架构 一.二进制安装mysql [root@node5 data]# --Linux.x86_64.ssl101.tar.gz [root@node5 data]# ...
- 4-HTML Computer Code Elements
HTML Computer Code Elements Tag Description <code> Defines programming code <kbd> Define ...
- 使用Filezilla搭建FTP服务器
1.FTP over TLS is not enabled, users cannot securely http://blog.sina.com.cn/s/blog_4cd978f90102vtwl ...
- zxing源码编译与运行
编译的jar文件下载地址:http://files.cnblogs.com/rainboy2010/zxing.zip zxing是一个开源的解析条形码/二维码的类库,广泛应用于Android 各大A ...
- Confluence 6 配置 HTTP 超时设置
当宏,例如 RSS Macro 进行 HTTP 请求的时候,有可能因为请求的时间比较长,而导致超时.你可以通过设置系统参数来避免这个问题. 配置 HTTP 超时设置: 在屏幕的右上角单击 控制台按钮 ...
- Linux基础实操五
实操一:nginx服务 二进制安装nginx包1) 1)#yum clean all 2)#yum install epel-release -y 3)#yum install nginx -y 1) ...