wtforms主要实现的是表单验证

预备知识:

当我们实例化一个类的时候我们首先要看其有没有metaclass如果有创建类的时候首先执行metaclass中__init__方法

当我们实例化类的时候先执行metaclass中的__call__方法,再执行类的__new__方法,最后才执行__init__方法

了解源码:

先贴一个例子吧, 这样好切入:

from wtforms import Form
from wtforms.fields import simple
from wtforms import validators
from wtforms import widgetsclass LoginForm(Form):user = simple.StringField(validators=[validators.DataRequired(message='不能为空')],widget=widgets.TextInput(),render_kw={'class': 'form-control'})pwd = simple.PasswordField(validators=[validators.DataRequired(message='不能为空')],widget=widgets.PasswordInput(),render_kw={'class': 'form-control'})

  

在上面我创建了一个表单类,然后我们就可以慢慢开始说了。

代码一行行开始执行当代码执行到

我声明这个类的时候,我创建了一个LoginForm的类:这是看看我继承的Form中是否有metaclass如果有看看有没有__init__方法

class Form(with_metaclass(FormMeta, BaseForm)):。。。。

  

class FormMeta(type):def __init__(cls, name, bases, attrs):type.__init__(cls, name, bases, attrs)cls._unbound_fields = Nonecls._wtforms_meta = None....

可以看到Form继承了with_metaclass这个返回的实际上是一个由FormMeta为metaclass创建的BaseForm类。所以创建类的时候走FormMeta的__init__方法。在类中定义了两个属性_unbound_field和_wtforms_meta。

接着我们看下面,我定义了两个属性,分别是两个类的实例化。老样子看看meta_class和其中的__init__

看到没有metaclass那一切就变得简单了,我们在看看是否有__new__方法

class Field(object):。。。def __new__(cls, *args, **kwargs):if '_form' in kwargs and '_name' in kwargs:return super(Field, cls).__new__(cls)else:return UnboundField(cls, *args, **kwargs)

因为我们在实例化的时候没有‘_form’,'_name'属性所以返回的是一个UnboundField对象,主要作用内部有一个

UnboundField.creation_counter可以进行计数

我们在看FormMeta中的__call__

 def __call__(cls, *args, **kwargs):"""Construct a new `Form` instance.Creates the `_unbound_fields` list and the internal `_wtforms_meta`subclass of the class Meta in order to allow a proper inheritancehierarchy."""if cls._unbound_fields is None:fields = []for name in dir(cls):if not name.startswith('_'):unbound_field = getattr(cls, name)if hasattr(unbound_field, '_formfield'):fields.append((name, unbound_field))# We keep the name as the second element of the sort# to ensure a stable sort.fields.sort(key=lambda x: (x[1].creation_counter, x[0]))cls._unbound_fields = fields# Create a subclass of the 'class Meta' using all the ancestors.if cls._wtforms_meta is None:bases = []for mro_class in cls.__mro__:if 'Meta' in mro_class.__dict__:bases.append(mro_class.Meta)cls._wtforms_meta = type('Meta', tuple(bases), {})return type.__call__(cls, *args, **kwargs)

  主要是把所有unbound_field放到一个列表中,然后对其进行排序,付给cls._unbound_fields。cls._wtforms_meta等于一个类。

Form。__init__主要对cls._unbound_fields列表内的对象进行实例化然後付给self._fileds[name] = object

最后对其进行循环使用setattr设置到类中。非常精髓

class Form(with_metaclass(FormMeta, BaseForm)):Meta = DefaultMetadef __init__(self, formdata=None, obj=None, prefix='', data=None, meta=None, **kwargs):meta_obj = self._wtforms_meta()if meta is not None and isinstance(meta, dict):meta_obj.update_values(meta)super(Form, self).__init__(self._unbound_fields, meta=meta_obj, prefix=prefix)for name, field in iteritems(self._fields):# Set all the fields to attributes so that they obscure the class# attributes with the same names.setattr(self, name, field)self.process(formdata, obj, data=data, **kwargs)

  

转载于:https://www.cnblogs.com/Stay-J/p/9010780.html

flask-wtforms相关推荐

  1. Flask wtforms

    wtforms 简介 WTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进行验证. 安装: ? 1 pip3 install wtforms 用户登录注册示例 1. 用户登录 ...

  2. flask WTForms

    WTForms由三个主要部分组成:字段,检验器和表单 字段代表输入域,做初步的检查 检验器是附加在字段上的函数,确保表单中的数据符合要求 表单是python类,包含了字段和检验器 表单 描述 Date ...

  3. Flask开发微电影网站(一)

    1.用到的Flask知识 1.使用整形,浮点型,路径型,字符串型下正则表达式路由转化器 2.使用GET与POST请求,上传文件,cookie获取与响应,404处理 3.使用模板自动转义,定义过滤器,定 ...

  4. Flask项目之个性化微电影网站的实战开发(一)

    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 项目源码下载 目录 一丶叙述 二丶Windows环境搭建 三丶项目分析丶搭建目录以及模型设计 四丶搭建前台页面 一丶叙述 1.项目 ...

  5. python视频网站项目_[项目实战] Python Flask构建微电影视频网站

    注:本站源码仅做学术研究,自娱自乐使用,不得用于任何的非法商业用途 由于版权原因.本站将无限期停止微擎模块资源下载如果有任何侵犯您权益的内容请联系小站删除哦.小站一定会积极配合的. 课程目录: (下载 ...

  6. python视频网站项目_Python超羽量级灵活框架 Flask实战微电影视频网站 大小项目通吃 Flask实战项目...

    课程名称: Python超羽量级灵活框架 Flask实战微电影视频网站 大小项目通吃 Flask实战项目视频教程 课程简介: Flask作为Python编写的Web小型框架,可以使用Python快速开 ...

  7. Python-Flask开发微电影网站(一)

    1.用到的Flask知识 1.使用整形,浮点型,路径型,字符串型下正则表达式路由转化器 2.使用GET与POST请求,上传文件,cookie获取与响应,404处理 3.使用模板自动转义,定义过滤器,定 ...

  8. python 开发视频播放网站_python开发微电影视频网站教程附源码

    做为一个合格的Pythoner,只掌握一个框架是不够,如果你有过其它Python框架(例如django)的使用经验,对比不同框架的特性来学习,你将收获更多 当前信息若含有黄赌毒等违法违规不良内容,请点 ...

  9. android反编译后有中文乱码,android反编译查看源码,apk解压后XML乱码解决

    详解MySQL的用户密码过期功能 这篇文章主要为大家详细介绍了MySQL的用户密码过期功能的相关资料,需要的朋友可以参考下   Payment Card Industry,即支付卡行业,PCI行业表示 ...

  10. (旧)3- Flask构建弹幕微电影网站- 课程介绍

    Flask 构建微电影视频网站 已上线演示地址: http://movie.mtianyan.cn 项目源码地址:https://github.com/mtianyan/movie_project 持 ...

最新文章

  1. json解析:[1]gson解析json
  2. sorry for yesterday
  3. Android四大组件之BroadCastReceiver
  4. 怎么测并发 PHP,PHP接口并发测试的方法(推荐)
  5. Android--生命周期【转】
  6. 【C语言】强迫症是不是病QAQ
  7. EF性能优化-有人说EF性能低,我想说:EF确实不如ADO.NET
  8. [android] 切换界面的通用处理
  9. linux open函数详解
  10. 3D 打印开源软件 cura
  11. MTK 驱动部分双分区升级原理
  12. IT30: 30岁IT人CTOCIO职业生涯探讨(2009-2013)
  13. laravel获取最后一条
  14. rethinkdb_如何在Node.js应用程序中使用RethinkDB
  15. peek用法解决多读一行
  16. LTE信令流程——附着
  17. S32K-LPSPI中文手册
  18. [推荐]中国联通推出3G新套餐,基本套餐最低46元
  19. antd pro学习入门笔记+todolist实例
  20. 这几个图片工具请收藏好,能够解决大家拼图需求

热门文章

  1. crontab/ntpdate——时间同步
  2. 剑指offer-3 从尾到头打印链表
  3. MAX232和PL2303、CH340的区别
  4. 关于贝叶斯的一个小小的总结
  5. 关于const变量的一点理解
  6. python从入门到实践15章的几个自己的小程序
  7. 4.1 多层感知机从0开始 4.2 多层感知机简洁实现(API调用)
  8. 计组-CISC/RISC小节
  9. 5G NR 随机接入--PRACH
  10. Maven引入依赖后自动下载并关联源码(Source)