日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

flask-wtforms

發布時間:2024/4/17 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 flask-wtforms 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。