form = LoginForm(formdata=request.form) # 值.get('k1')、值.getlist()
form = LoginForm(data={'k1': 'v1'}) # 值['k1']
form = LoginForm(obj=对象) # 值.k1
继续,看form.validate() ------> 分析验证流程:
LoginForm没有validate方法,看父类:
python复制代码
def validate(self):
"""
Validates the form by calling `validate` on each field, passing any
extra `Form.validate_<fieldname>` validators to the field validator.
"""
extra = {}
for name in self._fields: # 循环每个field
#寻找当前类中以 validate_字段名 匹配的方法,例如pwd字段就寻找validate_pwd,也就是钩子函数
inline = getattr(self.__class__, 'validate_%s' % name, None)
if inline is not None:
extra[name] = [inline] # 把钩子函数放到extra字典中
return super(Form, self).validate(extra) # 接着调用父类的validate方法
def validate(self, extra_validators=None):
self._errors = None
success = True
for name, field in iteritems(self._fields): # 循环字段的名称和对象,比如第一个就分别是user和StringField对象
if extra_validators is not None and name in extra_validators: # 判断该字段是否有钩子函数
extra = extra_validators[name] # 获取到钩子函数
else:
extra = tuple()
if not field.validate(self, extra): # 执行当前字段对象的validate方法
success = False
return success
def post_validate(self, form, validation_stopped):
"""
Override if you need to run any field-level validation tasks after
normal validation. This shouldn't be needed in most cases.
:param form: The form the field belongs to.
:param validation_stopped:
`True` if any validator raised StopValidation.
"""
pass