美文网首页
wtforms 情景分析

wtforms 情景分析

作者: lindyang | 来源:发表于2018-09-11 20:04 被阅读0次

后端经常使用 Form 作表单验证, 但是你知道

  • 表单中的键值是怎么绑定到 Field 上的?
  • Field 中的 validators, filters, default 调用顺序是什么?

要想回答以上问题, 就需要从源码说起.

先上伪源码为敬

class UnboundField(object):
    ⑨def bind(self, form, name, ...):
        return self.field_class(*self.args, **kw)

class DefaultMeta(object):
    ⑧def bind_field(self, form, unbound_field, options):
        return unbound_field.bind(form=form, **options)

class Field(object):
    def __new__(cls, *args, **kwargs):
        ⑩if '_form' in kwargs and '_name' in kwargs:
            return super(Field, cls).__new__(cls)
        ①else:  # 扫描到 name = StringField
            return UnboundField(cls, *args, **kwargs)

    ⑪def __init__(self, *args, **kwargs):
        pass

    def process(self, formdata, data=unset_value):
        if data is unset_value:
            设置 default
        if formdata is not None:
            有 key 时, default 所做的工作付诸东流
        self.data = filter(self.data)

    def validate(self, form, extra_validators=tuple()):
        itertools.chain(self.validators, extra_validators)


class FormMeta(type):
    ②def __init__(cls, name, bases, attrs):  # DemoForm 定义完毕
        type.__init__(cls, name, bases, attrs)
        cls._unbound_fields = None
        cls._wtforms_meta = None

    ③def __call__(cls, *args, **kwargs):  # DemoForm(...)
        设置 cls._unbound_fields
        设置 cls._wtforms_meta


class BaseForm(object):
    ⑥def __init__(self, ...):
        for:
            ⑦field = meta.bind_field(self, unbound_field, options)

    def process(self, formdata=None, obj=None, data=None, **kwargs):
        obj 和 (data, kwargs) 不含 name 时调用 field.process(formdata)

    def validate(self, extra_validators=None):
        field.validate(self, extra)


def with_metaclass(meta, base=object):
    return meta("NewBase", (base,), {})


class Form(with_metaclass(FormMeta, BaseForm)):
    ④def __init__(self, formdata=None, ...):  # 初始化 DemoForm(args)
        ⑤super(Form, self).__init__(self._unbound_fields, meta=meta_obj, prefix=prefix)
        self.process(formdata, obj, data=data, **kwargs)

    def validate(self):
        收集 extra
        return super(Form, self).validate(extra)

一言不合举例子

class DemoForm(Form):
    name = StringField("name", validators=[DataRequired()], filters=(), default=None)

form = DemoForm(args)
form.validate()
  1. 扫描到 name = StringField, 调用 Field.__new__
  2. DemoForm 定义完毕, 调用元类 FormMeta.__init__
  3. 遇到 form = DemoForm(args) 时:
  • 先调用 元类 FormMeta.__call__
  • 再调用 Form.__init__, 继而触发每个 Field.process
  1. 运行 form.validate() 最终会调用到每个 Field.validate

相关文章

  • wtforms 情景分析

    后端经常使用 Form 作表单验证, 但是你知道 表单中的键值是怎么绑定到 Field 上的? Field 中的 ...

  • Flask-FlaskWTF表单扩展

    WTForms支持的HTML标准字段 WTForms常用验证函数 使用Flask-WTF需要配置参数SECRET_...

  • 设计模式

    Java 设计模式情景分析 ——单例模式 Java 设计模式情景分析——建造者模式 Java 设计模式情景分析——...

  • Flask表单2019-08-17

    1.定义WTForms表单类

  • flask-wtf使用笔记

    一、WTForms 这个库一般有两个作用: 做表单验证 模版渲染 表单验证 自定义一个表单类,继承 wtforms...

  • 06:项目管理进度22

    数据分析(P213)假设情景分析----对各种情景进行评估,预测它们对项目目标的影响(积极或消极的)。对“如果情景...

  • 4.1Flask-WTF

    Flask-WTF Flask-WTF是简化了WTForms操作的一个第三方库。WTForms表单的两个主要功能是...

  • flask表单提交和数据库的交互

    flask表单 初始化表单from wtforms import StringField,SubmitField,...

  • wtForms 使用简介

    近期在用aiohttp替换tornado重构一部分api,其中一些接口需要验证比较多的请求参数,之前同事开发时挺赶...

  • WTForms验证器

    验证数据是否为空: 验证字段是否输入了内容: 验证IP是否为有效IP ipv4默认为True ipv6 默认Fa...

网友评论

      本文标题:wtforms 情景分析

      本文链接:https://www.haomeiwen.com/subject/ucqpgftx.html