Flask_WTForms源码流程(糙版)

from flask import Flask, render_template, request, redirect

# Form
# _fields
# validate
# validata_name
# validata_pwd
from wtforms import Form

# 字段(通过正则进行校验;插件生成HTML标签)
# - 插件对象
# - post_validate
# - __call__
# - __str__
from wtforms.fields import core
from wtforms.fields import html5
from wtforms.fields import simple

# 插件
# __call__返回:<input />
from wtforms import widgets

from wtforms import validators


app = Flask(__name__, template_folder='templates')
app.debug = True

"""
LoginForm._unbound_fields = None
LoginForm._wtforms_meta = None
"""
class LoginForm(Form):
# name = UnboundField(StringField, *args, **kwargs) creation_counter=1
name = simple.StringField(
label='用户名',
validators=[
validators.DataRequired(message='用户名不能为空.'),
validators.Length(min=6, max=18, message='用户名长度必须大于%(min)d且小于%(max)d')
],
widget=widgets.TextInput(),
render_kw={'class': 'form-control'}
)
# pwd = UnboundField(PasswordField, *args, **kwargs) creation_counter=2
pwd = simple.PasswordField(
label='密码',
validators=[
validators.DataRequired(message='密码不能为空.'),
validators.Length(min=8, message='用户名长度必须大于%(min)d'),
validators.Regexp(regex="^(?=.*[a-z])(?=.*[A-Z])(?=.*d)(?=.*[$@$!%*?&])[A-Za-zd$@$!%*?&]{8,}",
message='密码至少8个字符,至少1个大写字母,1个小写字母,1个数字和1个特殊字符')
],
widget=widgets.PasswordInput(),
render_kw={'class': 'form-control'}
)

class Meta:
csrf = False

def validate_pwd(self,*args,**kwargs):
pass
# 解释到这里...




@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'GET':
# type.__call__
# LoginForm._unbound_fields 已经有值(所有字段) [(name,_unbound_fields()),(name,_unbound_fields()),]
# LoginForm._wtforms_meta = 类(Meta)(所有的Meta)
# LoginForm._wtforms_meta = type('Meta', tuple(bases), {})

# LoginForm.__new__
# LoginForm.__init__
# 示例化Meta: meta_obj{name = 'alex','xx':'xxx'}
# self._fields = {
# name = StringField()
# pwd = PasswordField()
# }
# self.name = StringField()
# self.pwd = PasswordField()
# class User:
# def __init__(self,name):
# self.name = name
# obj = User('alex')

# form = LoginForm(data={'name':'alex'})
# form = LoginForm(obj=obj) #
# form = LoginForm(formdata=request.args)
# 页面标签数据初始化:data=字典, obj=对象.字段 formdata=有getlist方法
form = LoginForm()
# print(form.name)
return render_template('login.html', form=form)
else:
form = LoginForm(formdata=request.form)
if form.validate():
print('用户提交数据通过格式验证,提交的值为:', form.data)
else:
print(form.errors)
return render_template('login.html', form=form)

def test():
form = LoginForm()




if __name__ == '__main__':
app.run()
原文地址:https://www.cnblogs.com/Wormhole-f/p/8268903.html