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主要有两大重要动能: 表单 ...
随机推荐
- python 指定日期图片文件删除
手机使用python操作图片文件 起因 前几天去国图拍了一本书,一本心理学方面的书,也许你问我为什么不去买一本,或者去网上找pdf. 其实吧,关于心理学方面的书可以说在市面上一抓就是一堆,至于拍这本书 ...
- requests支持socks5代理了
记录下 以前: import socket import socks from requests_html import HTMLSession session=HTMLSession() socks ...
- 8种Nosql数据库系统对比(转)
导读:Kristóf Kovács 是一位软件架构师和咨询顾问,他最近发布了一片对比各种类型NoSQL数据库的文章. 虽然SQL数据库是非常有用的工具,但经历了15年的一支独秀之后垄断即将被打破.这只 ...
- 设计模式C++学习笔记之十五(Composite组合模式)
15.1.解释 概念:将对象组合成树形结构以表示“部分-整体”的层次结构.Composite使得用户对单个对象和组合的使用具有一致性. main(),客户 CCorpNode,抽象基类,实现基本信 ...
- safarai - loading.close() 无效问题
代码环境: vue + elenment 问题描述: 上传文件时,显示loading动画:上传成功后,隐藏loading动画.window 下常用的浏览正常,safari 下的chrome浏览器(目前 ...
- Qt5全局热键第三方库qxtglobalshortcut5使用
1.下载第三方库https://github.com/ddqd/qxtglobalshortcut5. 2.把qxtglobalshortcut5文件放在项目目录下,在项目.pro加入一句,inclu ...
- hue的历史查询记录querys乱码问题解决
hue的历史查询记录querys乱码问题解决: master1中配置文件/home/hadoop/.versions/hue-3.10.0/desktop/conf/hue.ini 可以看到连接的是m ...
- linux mysql 定时备份 使用crontab
第一步:在服务器上配置备份目录代码: mkdir /var/lib/mysqlbackup cd /var/lib/mysqlbackup 第二步:编写备份脚本代码: vi dbbackup.sh ...
- 使用参数innodb_file_per_table支持MySQL InnoDB表数据共享空间自动收缩
http://heylinux.com/archives/2367.html http://blog.csdn.net/ywh147/article/details/8996022 使用过MySQL的 ...
- ubuntu 问题
1.打开ubuntu之后的开启页面出现:所选模式均不匹配可能的模式:为 CRTC 63 尝试模式CRTC 63:尝试 800x600@60Hz 模式输出在 1366x768@60Hz (通过 0)CR ...