• 基于wtforms源码实现自定义form组件


    from flask import Flask,Markup,render_template,request,redirect
    from wtforms.form import  Form
    
    from wtforms.fields import core
    from wtforms import widgets
    
    #插件
    class Widget(object):
        pass
    
    class TextInput():
        def __call__(self, *args, **kwargs):
            return "<input type='text' name='name'/>"
    
    class TextErea():
        def __call__(self, *args, **kwargs):
            return '<textarea name="email"> </textarea>'
    #字段
    class Field():
    
        def __str__(self):
            return Markup(self.widget())
    
    
    class StringField(Field):
        widget=TextInput()
    
    
        def validate(self,data):
            if data:
                return True
    
    class EmailField(Field):
        widget=TextErea()
    
    
        def validate(self,data):
            reg = ".*@.*"
            import re
            if re.match(reg,data):
                return True
    #Form
    class BaseForm(object):
        def __init__(self,*args,**kwargs):
            _fields={}
            for name,field in self.__class__.__dict__.items():
                if isinstance(field,Field):
                    _fields[name]=field
    
            self._fields=_fields
            self.data={}
    
    
        def validate(self,form_data):
            flag=True
            for name,field in self._fields.items():
                input_val=form_data.get(name,'')
                result=field.validate(input_val)
                if not result:
                    flag=False
                else:
                    self.data[name]=input_val
            return flag
    
    
    class LoginForm(BaseForm):
        name=StringField()
        email=EmailField()
    
    
    
    app=Flask(__name__)
    
    @app.route('/login',methods=['GET','POST'])
    def login():
        if request.method=='GET':
            form=LoginForm()
            return  render_template('login.html',form=form)
        else:
            form=LoginForm()
            if form.validate(request.form):
                print('login success')
                return 'hello'
            return redirect('/login')
    
    
    if __name__ == '__main__':
        app.run()
    View Code
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Title</title>
    </head>
    <body>
    <form  method="post">
       {{ form.name }}
        {{ form.email }}
        <input type="submit">
      </form>  
    </body>
    </html>
    View Code

    根据源码可以看出,实际上请求的流程可以分为三个大类:Form,插件Widget,,字段Field,用到的更多是面向对象的知识

  • 相关阅读:
    Golang 函数,我觉得比较有意思的几个东西
    Golang 基础
    JVM快速扫盲篇
    好用的Scrum (敏捷开发)工具有哪些?推荐三个顶级的Scrum 管理工具
    一篇文章帮助你理解跑马灯的滚动原理
    如何来理解Python中的字典数据类型
    一篇文章带你了解HTML的网页布局结构
    通过webgoat-xxe、jwt学习Java代码审计
    DNS隧道
    KTL 一个支持C++14编辑公式的K线技术工具平台
  • 原文地址:https://www.cnblogs.com/ctztake/p/8260525.html
Copyright © 2020-2023  润新知