#!/usr/bin/env python
# -*- coding:utf- -*-
import tornado.ioloop
import tornado.web
import re
class MainForm(object):
def __init__(self):
self.host = "(.*)"
self.ip = "^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$"
self.port = '(\d+)'
self.phone = '^1[3|4|5|8][0-9]\d{8}$' def check_valid(self,handle):
flag = True
value_dict = {}
for key,regular in self.__dict__.items():
input_value = handle.get_argument(key)
val = re.match(regular, input_value)
print(key, input_value, val, regular)
if not val:
flag = False
value_dict[key] = input_value
return flag, value_dict class IndexHandler(tornado.web.RequestHandler):
def get(self, *args, **kwargs):
self.render('index.html') def post(self, *args, **kwargs):
obj = MainForm() is_valid, value_dict = obj.check_valid(self)
print(is_valid) if is_valid:
print(value_dict) settings = {
'template_path': 'views',
'static_path': 'statics',
# 'static_url_prefix':'/statics/',
# 'xsrf_cookies':True
} application = tornado.web.Application([
(r"/index", IndexHandler),
# (r"/checkout", CheckoutHandler), ], **settings) if __name__ == "__main__":
application.listen()
tornado.ioloop.IOLoop.instance().start()

优化前form.py

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/index" method="post">
<input type="text" name="host" placeholder="host" >
<input type="text" name="ip" placeholder="ip" >
<input type="text" name="port" placeholder="port" >
<input type="text" name="phone" placeholder="phone" >
<input type="submit" value="提交">
</form>
</body>
</html>

index.html

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcUAAABsCAIAAACUxz5BAAAFfUlEQVR4nO3bT27jVBzA8XcTjsFyjsARWHKEOcJcIEr6N0or0c4MB2DJcjaVWLIqRYAYBIIRINiGRSVj/Of52fklnmY+H0XIcZ6fnyPrW5dCegAgQpp7AQBHQk8BYugpQAw9BYihpwAx9BQgRnr9+gsvLy8vr91faQtABD0FiKGnADH0FCCGngLE0FOAGHoKEENPAWJ09/QVvHp14HuRHd3f3798+fLzOdze3t7f38/9Bcyvt6cHXgfvm33cAynt9/ehxvwTTlcd0j42M/m+r6vQzc3NP/O5ubmZ+wuYn57SLXMPpP/r3Fn/qH7gHlcc2tPB2fI9bQ/OfzmdA/JfZtv19fXf87m+vh5c4dHTU7oV3gPtrOQf8XZMRvli2qcbO0PfbIMjSwaMutjCwVdXV3/N5+rqqvyKjpWe0i1/DwxmpaQguwc0M2HmcbJwhr6PCn8eRPW0fORms/kzK6VUbdTlBxfabDaF6zxiZT19uP0kvXiTmeYAAzisCT2t3g4+r/XtmaYdtUbd8s+teSWLH7yQwfhmDiwZ9miz2fyRlVJqbDS2+8aX0NNtUU8fvvzs45QysTvAAA5uWk8794zauYtGzTNxz8/QuT9T2PAL2bZ+JJRYr9fvslJK1UZdfUBeZvL1eh3+JTw5Az1999WLZx89e/78077YHWAAs5j2+37qejxsDOiz44I7Jxk7bab79UvLX0XIFU04fL1e/96jvc76R31HjaKn2+Gefv3mm3fb7ZsXvTXc/wBmMdjTviDWNxpRyL/dUbtiKft8ml985/ix6+k8UfukIafbbreXl5e/ZaWUqo26zMjGdsbl5eXYBR+fsn9/Ohi7AwzgsMr/Jlleyf31NP3/EbIxeSZeJUtqR7Akjn1TjbqiUS4uLn7NSinlB/QNKznw4uJi7IKPj57SbWxPJyRmTz3tm3nHJTUCnZ8ns4a++SePrJyfn/+S9fgNVBt19THVP/v2dDo/Px+74OOjp3Qr6Wnjka3a2d4oN2GpjTP29T1/bGZPe395Tydf74Sv4uzs7Oce1ekaO/vGV5/mx9SdnZ2NXfDx0VO6lfz/UdXbbbanmXnyn45tSiZ503qa2R4sY+cZy69oQk9PT0/fZqWU6hvVygfHlzg9PR274OOjp3Qr/Pv+Nvsglj/Fe9LT9mo7fyTUf2yU1LM9su/YwWspdHJy8lNWSqm+Ub3NDM6PqTs5ORm74OMzoadvO/7L++ABzC/k71GDxRw186iV5Hs6GP3OGmYevTv3lDzq9pnQ09Vq9WNWSqm+Ub1tD6t/1HjbZ7VajV3w8SnrKR+ewXug8bzWZ3CGaZ8OHjK4kpKaZ4I4av5RZx/1GFu3XC5/6Pe4yMeN6m2lMSZzeJ/lcjl2wcdHT+lW+PeoXQZMSEb56VL2+XTChPn9mZHTPipe43+Wy+X389HTrZ7Sxz3w5CwWi+/ms1gs5v4C5qendHMPPDmLxeJhPnq61VP6uAeenOVy+e18/L6/zfQUDnwvsqO7u7vVarWYw3K5vLu7m/sLmF/wHwQAPlh6ChBDTwFi6ClADD0FiKGnADH0FCCGngLE0FOAGHoKEENPAWLoKUAMPQWIoacAMfQUIIaeAsTQU4AYegoQQ08BYugpQAw9BYihpwAx9BQghp4CxNBTgBh6ChBDTwFi6ClADD0FiKGnADH0FCCGngLE0FOAGHoKEENPAWLoKUAMPQWIoacAMfQUIIaeAsTQU4AYegoQQ08BYugpQAw9BYihpwAx9BQghp4CxNBTgBh6ChBDTwFi6ClADD0FiKGnADH0FCCGngLE0FOAGHoKEENPAWLoKUAMPQWIoacAMfQUIIaeAsTQU4AYegoQQ08BYugpQAw9BYihpwAx9BQgxr+ihu/JtFrcNgAAAABJRU5ErkJggg==" alt="" />

#!/usr/bin/env python
# -*- coding:utf- -*-
#!/usr/bin/env python
# -*- coding:utf- -*-
import tornado.ioloop
import tornado.web
import re class IPFiled:#定义类
#定义正则
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, required=True, error_dict=None):
# required = True, error_dict = {'required': "别闹,别整空的..", "valid": "骚年,格式错误了"}
"""
required = True的话证明不能为空,
:param error_dict: 存错误的字典信息
"""
# 封装了错误信息
self.error_dict = {}#定义一个新的错误字典{'required': "别闹,别整空的..", "valid": "骚年,格式错误了"}
if error_dict:#如果错误字典有内容,为True
self.error_dict.update(error_dict)#那就把错误内容更新到字典里面 self.required = required #默认等于true self.error = None # 错误信息
self.value = None#值
self.is_valid = False#验证是否通过,默认为false def validate(self, name, input_value): #定义name和输入的值(name是key也是ip)
"""
:param name: 字段名
:param input_value: 用户表单中输入的内容
:return:
"""
if not self.required: #如果为false,那么就是不用输入
# 用户输入可以为空
self.is_valid = True #通过验证
self.value = input_value#值是输入的值
else:#如果为True
if not input_value.strip():#假如输入为空值的话,not inp..strip就是True,就是证明没有值
if self.error_dict.get('required',None): #如果错误列表获取
# error_dict = {'required': "别闹,别整空的..", "valid": "骚年,格式错误了"}
self.error = self.error_dict['required']#"别闹,别整空的..
else:#如果没有别闹,别整空的,就是required的值为空的话
self.error = "%s is required" % name #self.error = 这个”ip is ....“
else:#假如有值
ret = re.match(IPFiled.REGULAR, input_value)#(正则, 输入的信息)
if ret:#如果有匹配的话
self.is_valid = True #
self.value = input_value #输入的内容,value
else:#没有匹配到的话
if self.error_dict.get('valid', None): # 获取valid的值有内容的话,valid": "骚年,格式错误了"
self.error = self.error_dict['valid']#那么错误的值就等于这个
else:#如果没有则为无效的(这句的意思就是如果你没人输入骚年什么的。。。就这句了)
self.error = "%s is invalid" % name class BaseForm: #定义baseform类
def check_valid(self, handle):#handle就是homehandler的对象
flag = True#定义了一个标志位
error_message_dict = {} #错误消息列表
success_value_dict = {}#成功消息列表
for key, regular in self.__dict__.items():#{}
# key: ip .....
# handle: HomeIndex对象,self.get_... self.
# regular: IPFiled(required=True)
input_value = handle.get_argument(key)#输入ip的值
# input_value = 用户输入的值
# 将具体的验证,放在IPFiled对象中
regular.validate(key, input_value) #regular是HomeForm类里面的IPFiled。。。,所以可以调用IPFiled的validate方法
if regular.is_valid:
success_value_dict[key] = regular.value#key等于输入的值
else:
error_message_dict[key] = regular.error#等于错误信息
flag = False return flag, success_value_dict, error_message_dict class HomeForm(BaseForm):
def __init__(self):
self.ip = IPFiled(required=True, error_dict={'required': "别闹,别整空的..", "valid": "骚年,格式错误了"})
#self.ip就是一个对象
class HomeHandler(tornado.web.RequestHandler):
def get(self):
self.render('home.html',error_dict = None) def post(self, *args, **kwargs):
obj = HomeForm()#创建了对象
# 获取用户输入的内容
# 和正则表达式匹配
is_valid, success_dict, error_dict = obj.check_valid(self)
if is_valid:
print('success',success_dict)
else:
print('error', error_dict)
self.render('home.html', error_dict = error_dict) settings = {
'template_path': 'views',
'static_path': 'statics',
'static_url_prefix': '/statics/',
} application = tornado.web.Application([
# (r"/index", IndexHandler),
(r"/home", HomeHandler),
], **settings) if __name__ == "__main__":
application.listen()
tornado.ioloop.IOLoop.instance().start()

注释版ip表单验证

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/home" method="post">
<input type="text" name="ip" placeholder="ip">
{% if error_dict %}
<span> {{ error_dict['ip']}}</span>
{% end %}
<input type="submit"> </form>
</body>
</html>

home.html

Form 表单验证的更多相关文章

  1. form表单验证-Javascript

    Form表单验证: js基础考试内容,form表单验证,正则表达式,blur事件,自动获取数组,以及css布局样式,动态清除等.完整代码如下: <!DOCTYPE html PUBLIC &qu ...

  2. django之form表单验证

    django中的Form一般有两种功能: 输入html 验证用户输入 #!/usr/bin/env python # -*- coding:utf- -*- import re from django ...

  3. python_way day19 HTML-day5 (form表单验证,CSRF,cookie,session,缓存)

    python-way day19 1. dJango的form表单验证 2.CSRF 跨站请求伪造 3.cookie,session 4.缓存 一,django表单验证功能 1.django验证基础: ...

  4. form表单验证2

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. Day19 Django之Form表单验证、CSRF、Cookie、Session和Model操作

    一.Form表单验证 用于做用户提交数据的验证1.自定义规则 a.自定义规则(类,字段名==html中的name值)b.数据提交-规则进行匹配代码如下: """day19 ...

  6. [php基础]PHP Form表单验证:PHP form validator使用说明

    在PHP网站开发建设中,用户注册.留言是必不可少的功能,用户提交的信息数据都是通过Form表单提交,为了保证数据的完整性.安全性,PHP Form表单验证是过滤数据的首要环节,PHP对表单提交数据的验 ...

  7. django form表单验证

    一. django form表单验证引入 有时时候我们需要使用get,post,put等方式在前台HTML页面提交一些数据到后台处理例 ; <!DOCTYPE html> <html ...

  8. Django中的Form表单验证

    回忆一下Form表单验证的逻辑: 前端有若干个input输入框,将用户输入内容,以字典传递给后端. 后端预先存在一个Form表单验证的基类,封装了一个检测用户输入是否全部通过的方法.该方法会先定义好错 ...

  9. 抽屉之Tornado实战(7)--form表单验证

    在这里,我们把form表单验证的代码进行工具化了,以后稍微修改一下参数就可以拿来用了 先贴上代码 forms.py from backend.form import fields class Base ...

  10. ASP.NET MVC Form表单验证与Authorize特性

    一.Form表单验证 1.基本概念 表单验证是一个基于票据(ticket-based)[也称为基于令牌(token-based)]的系统.当用户登录系统以后,会得到一个包含基于用户信息的票据(tick ...

随机推荐

  1. FPM打包工具 可以把源码包制定为rpm包 是自动化部署的环节

    注意部FPM时的环境一定要跟生产环境的系统版本最好是保持一至,我第一次测试没通过,(我在CENTOS7和部属FPM打好的包在Centos6.x和安装,结果失败) 1:安装 FPM打包工具的依赖包: [ ...

  2. 2-2-求并集A=A∪B-线性表-第2章-《数据结构》课本源码-严蔚敏吴伟民版

    课本源码部分 第2章  线性表 - 求并集A=A∪B ——<数据结构>-严蔚敏.吴伟民版        ★有疑问先阅读★ 源码使用说明  链接☛☛☛ <数据结构-C语言版>(严 ...

  3. Android-一只手指滑动View,另一只手指按Home键,重新进入后View状态无法更新的问题

    上午测试报了一个bug:说是一只手指拖动虚拟摇杆上的View滑块不松,另一只手指点击Home键将App压后台,重新进入的时候,View滑块卡死了. 刚开始看到这个问题感觉很奇怪,因为正常情况下,手指离 ...

  4. 【机器学习】DBSCAN Algorithms基于密度的聚类算法

    一.算法思想: DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一个比较有代表性的基于密度的聚类算法.与划分和层 ...

  5. spring集成RabbitMQ配置文件详解(生产者和消费者)

    1,首先引入配置文件org.springframework.amqp,如下: <dependency> <groupId>org.springframework.amqp< ...

  6. Sqlserver 2008 error 40出现连接错误的解决方法

    说明(2017-5-25 15:00:16): 核心:把端口号改成1433 Sqlserver 2008 error 40出现连接错误的解决方法

  7. Javascript eval()函数 基础回顾

    如果您想详细了解ev al和JSON请参考以下链接: eval  :https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Glo ...

  8. DeepNLP的核心关键/NLP词的表示方法类型/NLP语言模型 /词的分布式表示/word embedding/word2vec

    DeepNLP的核心关键/NLP语言模型 /word embedding/word2vec Indexing: 〇.序 一.DeepNLP的核心关键:语言表示(Representation) 二.NL ...

  9. 模式匹配之Boyer-Moore算法

    BM 算法是一个较优的模式匹配算法.一般,如果不考虑模式串的长度,一个具有时间复杂度O(n)的算法应该是最优的了,但是事实不是如此.BM算法可以实现更高效率的模式匹配.分析和实验说明,BM匹配算法对于 ...

  10. Android——继续深造——从安装Android Studio 2.0开始(详)

    一.下载JDK,JRE,SDK http://jingyan.baidu.com/article/eb9f7b6d884ea7869364e8eb.html 二.配置环境变量: 我的电脑->属性 ...