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主要有两大重要动能: 表单 ...
随机推荐
- EntityFramework之事务
一.EF事务 引用程序集 using System.Transactions; 用法 var writer = new System.IO.StringWriter(); try { using (v ...
- jQuery.extend()参数
非原创,转载仅供学习 在处理插件参数的接收上,通常使用jQuery的extend方法.extend方法传递单个对象的情况下,这个对象会合并到jQuery身上,而当用extend方法传递一个以上的参数时 ...
- 防火墙iptables的简单使用
规则定义 # service iptables start # chkconfig iptables on 想让规则生效,则shell命令行下执行 sh /bin/iptables.sh即可 [roo ...
- mysql多表关联update修改操作
UPDATE province_yunnan_salary s1 JOIN province_guangdong_salary s2 ON s1.user_name= s2.user_name S ...
- 从MySQL中导入数据到MongoDB中
从sql中导出需要的数据为csv格式的数据 select field1,field2,...,fieldn from TABLE into outfile '/test.csv' fields ter ...
- UDP/TCP拾遗
1.UDP的特点 (1)UDP 是无连接的,即发送数据之前不需要建立连接. (2)UDP 使用尽最大努力交付,即不保证可靠交付,同时也不使用拥塞控制. (3)UDP 是面向报文的.UDP 没有拥塞控制 ...
- swift 学习- 14 -- 继承
// 一个类可以继承另一个 类的方法, 属性和其他特征, 当一个类继承其他类时, 继承类叫子类, 被继承类叫父类 或 (超类), 在 Swift 中, 继承是区分 [类] 和其他类型的 一个基本特征 ...
- Confluence 6 SQL Server 数据库驱动修改
从 Confluence 6.4 开始,我们使用官方的 Microsoft SQL Server JDBC 驱动来替换掉开源的 jTDS 驱动.从这个版本开始所有的安装都会默认使用官方的 Micros ...
- LeetCode(101):对称二叉树
Easy! 题目描述: 给定一个二叉树,检查它是否是镜像对称的. 例如,二叉树 [1,2,2,3,4,4,3] 是对称的. 1 / \ 2 2 / \ / \ 3 4 4 3 但是下面这个 [1,2, ...
- kali linux 更新问题
1.使用一次更新和升级软件替换 apt-get install && apt -y full -upgrade 之后使用 reboot重启 系统,重启之后 再次使用命令 ap ...