zoukankan      html  css  js  c++  java
  • Form 表单验证

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    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(8888)
        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

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    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(8001)
        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
  • 相关阅读:
    bzoj-2748 2748: [HAOI2012]音量调节(dp)
    bzoj-2338 2338: [HNOI2011]数矩形(计算几何)
    bzoj-3444 3444: 最后的晚餐(组合数学)
    codeforces 709E E. Centroids(树形dp)
    codeforces 709D D. Recover the String(构造)
    codeforces 709C C. Letters Cyclic Shift(贪心)
    codeforces 709B B. Checkpoints(水题)
    codeforces 709A A. Juicer(水题)
    Repeat Number
    hdu 1003 Max Sum (动态规划)
  • 原文地址:https://www.cnblogs.com/renfanzi/p/5715873.html
Copyright © 2011-2022 走看看