一. 自定义Tornado 验证模块
我们知道,平时在登陆某个网站或软件时,网站对于你输入的内容是有要求的,并且会对你输入的错误内容有提示,对于Django这种大而全的web框架,是提供了form表单验证功能,但是对于Tornado而言,就没有这功能,所以就需要我们来自己自定义form表单验证,而且这种方法正是Django里的form表单验证的实质内容,也帮我们在后面学习Django理解相关的源码。
写之前,我们必须知道form表单验证的实质是什么?
实质就是正则匹配
我们知道用户提交数据是通过post方式提交,所以我们重写post方法,并在post方法进行业务逻辑处理
- 获取用户提交的数据
- 将用户提交的数据和正则表达式匹配
写之前,我们必须知道form表单验证的实质是什么?
实质就是正则匹配
我们知道用户提交数据是通过post方式提交,所以我们重写post方法,并在post方法进行业务逻辑处理
- 获取用户提交的数据
- 将用户提交的数据和正则表达式匹配
class MainForm(object):
def __init__(self):
# 各种信息正则匹配规则
# 并且要求这里字段名和前端传来的name一致
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, request):
flag = True
form_dict = self.__dict__ #获取类的普通字段和值
for key, regular in form_dict.items():
post_value = request.get_argument(key) #获取用户输入的值
# 让提交的数据 和 定义的正则表达式进行匹配
ret = re.match(regular, post_value)
print key,ret,post_value
if not ret:
flag = False #一旦有匹配不成功的,设置为False
return flag #post方法里根据这个返回值来决定给客户返回什么内容
class IndexHandler(BaseRequestHandler):
def get(self):
self.render('index.html')
def post(self,*args,**kwargs):
obj = MainForm()
obj.check_valid(self)
self.get_argument()
因此我们应将自定义form中的自定义字段根据不同的正则表达式拆分成跟自己属性相关的类,实例如下:
根据每个字段的特性,定义基础的字段,如字符串,邮件类型,整数类等
class InputText: def __str__(self): return '<input type="text" />' class InputPassword: def __str__(self): return '<input type="password" />' class StringField: reg = "^\w+$" def __init__(self,w=None): self.w = w if w else InputText() def match(self): pass def __str__(self): return str(self.w)
基于基本的字段,定制基础form类
class IndexForm:
def __init__(self):
self.user = StringField()
self.pwd = StringField(w=InputPassword())
def is_valid(self,handler):#handler 为tornado中路由对应的处理类的实例化对象
flag = True
for k,v in self.__dict__.items():
# k="user" v="^\w+$" StringField对象
# k="pwd" v="^\w+$" EmailField对象
if type(v) == StringListField:
input_value = handler.get_arguments(k)
else:
input_value = handler.get_argument(k)
result = v.match(input_value)
if not result:
flag = False
return flag
自定义Form完整式例如下:
#!/usr/bin/env python # -*- coding:utf-8 -*- import tornado.ioloop import tornado.web import re class InputText: def __str__(self): return '<input type="text" />' class InputPassword: def __str__(self): return '<input type="password" />' class StringField: reg = "^\w+$" def __init__(self,w=None): self.w = w if w else InputText() def match(self): pass def __str__(self): return str(self.w) class StringListField: reg = "^\w+$" def __init__(self): pass def match(self): pass class EmailField: reg = "^\w+$" def __init__(self): pass class IndexForm: def __init__(self): self.user = StringField() self.pwd = StringField(w=InputPassword()) def is_valid(self,handler): flag = True for k,v in self.__dict__.items(): # k="user" v="^\w+$" StringField对象 # k="pwd" v="^\w+$" EmailField对象 if type(v) == StringListField: input_value = handler.get_arguments(k) else: input_value = handler.get_argument(k) result = v.match(input_value) if not result: flag = False return flag class IndexHandler(tornado.web.RequestHandler): def get(self, *args, **kwargs): form = IndexForm() self.render('index.html', form=form) def post(self, *args, **kwargs): form = IndexForm() ret = form.is_valid(self) print(ret) settings = { 'template_path': 'views' } application = tornado.web.Application([ (r"/index.html", IndexHandler), ], **settings) if __name__ == "__main__": print('http://127.0.0.1:8005') application.listen(8005) tornado.ioloop.IOLoop.instance().start()